$(function ()/* 一个封闭的执行环境 */
{
	(function ($R) // 传递参数$R，为window.parent.$readable
	{
		//	vars
		//	====
			$R.$win = $($R.win);    // 父窗口,就是被提取的对象
			$R.$document = $($R.document);  // 父文档结构
			$R.debug = false;

		//	local debug
		//	===========


		//	debug
		//	=====

	//	defaults to false
	if ($R.debug); else { $R.debug = false; }

	//	make it faster -- when not debugging
	//	==============
	if (!($R.debug))
	{
		$R.debugRemember = {};

		$R.writeLog 		= function () { return false; };
		$R.log 				= function () { return false; };

		$R.debugTimerStart 	= function () { return false; };
		$R.debugTimerEnd 	= function () { return false; };

		$R.debugPrint 		= function () { return false; };
		$R.printDebugOutput = function () { return false; };

		$R.debugOutline 	= function () { return false; };
	}
	else    // 调试相关配置
	{
		//	remember stuff
			$R.debugRemember = {};

		//	vars
		//	====
			$R.debugStuff = [];
			$R.debugTimers = [];

		//	write log
		//	=========
			$R.initializeWriteLogFunction = function ()
			{
				switch (true)
				{
					case (!(!($R.win.console && $R.win.console.log))):
						$R.writeLog = function (msg) { $R.win.console.log(msg); };
						break;

					case (!(!($R.win.opera && $R.win.opera.postError))):
						$R.writeLog = function (msg) { $R.win.opera.postError(msg); };
						break;

					default:
						$R.writeLog = function (msg) {};
						break;
				}
			};

		//	log
		//	===
			$R.initializeWriteLogFunction();
			$R.log = function ()
			{
				for (var i=0, il=arguments.length; i<il ; i++)
					{ $R.writeLog(arguments[i]); }

				$R.writeLog('-----------------------------------------');
			};

		//	outline
		//	=======
			$R.debugOutline = function (_element, _category, _reason)
			{
				switch (true)
				{
					case (!(_element.nodeType === 1)):
					case (!(_element.tagName > '')):
					case (_element.tagName.toLowerCase() == 'onject'):
					case (_element.tagName.toLowerCase() == 'embed'):
						//	don't outline
						break;

					default:
						var _color = '#000';
						switch (true)
						{
							case (_category == 'target' && _reason == 'first'): 				_color = '#00cc00';	break;
							case (_category == 'target' && _reason == 'second'): 				_color = '#0000cc';	break;

							case (_category == 'target' && _reason == 'next-page'):				_color = '#FF80C0'; break;
							case (_category == 'target' && _reason == 'add-above'): 			_color = '#804000'; break;

							case (_category == 'clean-before' && _reason == 'floating'): 		_color = '#808080'; break;
							case (_category == 'clean-after' && _reason == 'missing-density'): 	_color = '#C0C0C0'; break;

							case (_category == 'clean-after' || _category == 'clean-before'):	_color = '#000000'; break;
						}

						$(_element).css('outline','5px solid '+_color);
						$(_element).attr('readable__outline', (_category + ': ' + _reason));
						break;
				}
			};

		//	timers
		//	======
			$R.debugTimerStart = function (timerName)
			{
				$R.debugTimers.push({
					'name': timerName,
					'start': (new Date()).getTime()
				});
			};

			$R.debugTimerEnd = function ()
			{
				var _t = $R.debugTimers.pop(), _time = ((new Date()).getTime() - _t.start);
				$R.log('TIMER / '+_t.name+': ' + _time);
				return _time;
			};

		//	output -- will be shown in Show function
		//	======
			$R.debugPrint = function (_key, _value)
				{ $R.debugStuff[_key] = _value; };

			$R.printDebugOutput = function ()
			{
				//	return
					if ($R.debug); else { return; }
					if ($R.customScript) { return; }

				//	first
					var _first =
					[
                        'Language',
						'ExploreAndGetStuff',
						'ProcessFirst',
						'ProcessSecond',
						'BuildHTML',
						'BuildHTMLPregs',
                        'PointsFirst',
                        'PointsSecond',
                        'Target',
						'NextPage'
					];

				//	get and clean
					_$debug = $('#debugOutput');
					_$debug.html('');

				//	write
					var _debug_write = function (_key, _value)
					{
						_$debug.append(''
							+ '<tr>'
							+ 	'<td class="caption">'
							+		_key
							+ 	'</td>'
							+ 	'<td class="value">'
							+		_value
							+ 	'</td>'
							+ '</tr>'
						);
					}

				//	first
					for (var i=0, _i=_first.length; i<_i; i++)
						{ _debug_write(_first[i], $R.debugStuff[_first[i]]); delete($R.debugStuff[_first[i]]); }

				//	the rest
					for (var _k in $R.debugStuff)
						{ _debug_write(_k, $R.debugStuff[_k]); }

				//	end; stop
					$R.debugPrint = function () {};
					$R.printDebugOutput = function () {};
			};

		//	scriptable scrolling
			$R.debugScroll__before1 = function () { $R.win.scrollTo(0, 0); };
			$R.debugScroll__before2 = function () { $R.win.scrollTo(0, $R.$win.height()); };
			$R.debugScroll__before3 = function () { if ($($R.debugRemember['theTarget']).height() > 0) { $R.debugRemember['theTarget'].scrollIntoView(false); } else { $R.debugRemember['firstCandidate'].scrollIntoView(false); } $R.win.scrollBy(0, 100); };

			$R.debugScroll__after1 = function () { window.scrollTo(0, 0); };
			$R.debugScroll__after2 = function () { window.scrollTo(0, $R.$win.height()); };
			$R.debugScroll__after3 = function () { $('#page1').get(0).scrollIntoView(false); window.scrollBy(0, 100); };
	}


		//	environment
		//	===========

	//	environtment，是MAC嘛，是IOS嘛。。
	//	============

	$R.iOS = ($R.win.navigator.userAgent.match(/like Mac OS X/i) != null);
	$R.mac = (!$R.iOS && ($R.win.navigator.userAgent.match(/Macintosh/i) != null));


    //  language specific stuff
    //  =======================

        //  default
    $R.language = 'general';

        //  the text - start with title
        var _test_text = ' ' + $R.document.title;

        //  add couple of random paragraphs, divs
        var
            _ps = $R.document.getElementsByTagName('p'),
            _ds = $R.document.getElementsByTagName('div')
        ;

        //  add
        for (var i=0; i<5; i++) { _test_text += ' ' + $(_ps[Math.floor(Math.random()*_ps.length)]).text(); }
        for (var i=0; i<5; i++) { _test_text += ' ' + $(_ds[Math.floor(Math.random()*_ds.length)]).text(); }


        //  check
        switch (true)
        {
        //    case ($R.win.location.host.match(/\.jp$/i) != null):
        //    case ($R.win.location.host.match(/\.cn$/i) != null):
        //    case ($R.win.location.host.match(/\.tw$/i) != null):
        //    case ($R.win.location.host.match(/\.hk$/i) != null):
        //    case ($R.win.location.host.match(/\.kr$/i) != null):

            case (_test_text.match(/([\u3000])/gi) != null):
            case (_test_text.match(/([\u3001])/gi) != null):
            case (_test_text.match(/([\u3002])/gi) != null):
            case (_test_text.match(/([\u301C])/gi) != null):

                $R.language = 'cjk';
                break;
        }

        //  in case we stop
        $R.debugPrint('Language', $R.language);


		//	RUN: outside frame
		//	==================
    // 开始初始化，添加样式
	(function ()
	{

		var
			_document = $R.document,

			_html = _document.getElementsByTagName('html')[0],
			_html_identifier = (_html.id && _html.id > '' && _html.id.match(/^[a-z]/i) != null ? '#'+_html.id : 'html'),

			_body = _document.getElementsByTagName('body')[0],
			_body_identifier = (_body.id && _body.id > '' && _body.id.match(/^[a-z]/i) != null ? '#'+_body.id : 'body'),

			_cssElement = _document.createElement('style'),

			_cssText = ''

			//	body
			//	====
				+	_html_identifier + '.readableBeforeVisible, '
				+	'html > ' + _body_identifier + '.readableBeforeVisible, '
				+	_body_identifier + '.readableBeforeVisible '
				+	'{ '
				+		'position: static !important; '
				+	'} '

				+	_html_identifier + '.readableVisible, '
				+	'html > ' + _body_identifier + '.readableVisible, '
				+	_body_identifier + '.readableVisible '
				+	'{ '
				+		'margin: 0 !important; padding: 0 !important; border: 0 !important; '
				+		'overflow: hidden !important; overflow-x: hidden !important; overflow-y: hidden !important; '
				+	'} '


			//	objects
			//	=======
				+	_html_identifier + '.readableBeforeVisible object, '
				+	_html_identifier + '.readableBeforeVisible embed, '
				+	_html_identifier + '.readableBeforeVisible iframe, '
				+	'html > ' + _body_identifier + '.readableBeforeVisible object, '
				+	'html > ' + _body_identifier + '.readableBeforeVisible embed, '
				+	'html > ' + _body_identifier + '.readableBeforeVisible iframe, '
				+	_body_identifier + '.readableBeforeVisible object, '
				+	_body_identifier + '.readableBeforeVisible embed, '
				+	_body_identifier + '.readableBeforeVisible iframe '
				+ 	'{ '
				+		'visibility: hidden !important; '
				+	'} '

			//	frame
			//	=====
				+	_html_identifier + '.readableBeforeVisible #readable_iframe, '
				+	'html > ' + _body_identifier + '.readableBeforeVisible #readable_iframe, '
				+	_body_identifier + '.readableBeforeVisible #readable_iframe, '
				+	'#readable_iframe '
				+ 	'{ '
				+		'display: block !important; '
				+		'overflow: auto !important; '
				+		'visibility: visible !important; '
				+	'} '
		;

		//	css
		//	===
			_cssElement.setAttribute('id', 'readableCSS2');
			_cssElement.setAttribute('type', 'text/css');
			if (_cssElement.styleSheet) {_cssElement.styleSheet.cssText = _cssText; }
				else { _cssElement.appendChild(_document.createTextNode(_cssText)); }
			_body.appendChild(_cssElement);


		//	get frame
		//	=========
			$R.$iframe = $R.$document.find('#readable_iframe');

	})();

		//	translations
		//	============
    // 翻译
	$R.translations =
	{
		'menu__close__tooltip': 			'Hide the overlay.',
		'menu__clip_to_evernote__tooltip': 	'Clip to Evernote[=evernote_account].',
		'menu__print__tooltip': 			'Print.',
		'menu__settings__tooltip': 			'Show Themes.',
		'fitts__tooltip': 					'Hide the overlay.',

		'rtl__main__label': 'Text direction?',
		'rtl__ltr__label': 	'Left-to-right',
		'rtl__rtl__label': 	'Right-to-left',

		'blank_error__heading': 'Tips for using Clearly',
		'blank_error__body': 	'Clearly is currently designed to work on article pages. An article page is any page that contains one large block of text -- like, for example, a newspaper article or blog post.',

		'evernote_clipping': 		'Clipping...',
		'evernote_clipping_failed': 'Clipping failed.',

		'evernote_login__heading': 				'Sign in to Evernote',
		'evernote_login__spinner': 				'Signing in to Evernote',
		'evernote_login__create_account': 		'Create an account',
		'evernote_login__button_do__label': 	'Sign in',
		'evernote_login__button_cancel__label': 'Cancel',

		'evernote_login__username__label': 		'Evernote Username or Email Address',
		'evernote_login__password__label': 		'Password',
		'evernote_login__rememberMe__label': 	'Remember me',

		'evernote_login__username__error__required': 	'Username is required.',
		'evernote_login__username__error__length': 		'Username must be between 1 and 64 characters long.',
		'evernote_login__username__error__format': 		'Username contains bad characters.',
		'evernote_login__username__error__invalid': 	'Not a valid, active user.',

		'evernote_login__password__error__required': 	'Password is required.',
		'evernote_login__password__error__length': 		'Password must be between 6 and 64 characters long.',
		'evernote_login__password__error__format': 		'Password contains bad characters.',
		'evernote_login__password__error__invalid': 	'Username and password do not match existing user.',

		'evernote_login__general__error': 'Authentication failed.',

		'settings__theme__1': 'Newsprint',
		'settings__theme__2': 'Notable',
		'settings__theme__3': 'Night Owl',
		'settings__theme__custom': 'Custom',

		'settings__fontSize__small': 'small',
		'settings__fontSize__medium': 'medium',
		'settings__fontSize__large': 'large',

		'misc__page':	'page'
	};

	//	translate function（翻译函数，如果有就返回翻译信息，否则就返回KEY）
	$R.translate = function (_key) {
		return ((_key in $R.translations) ? $R.translations[_key] : _key);
	};


		//	from extension
		//	==============

	//	options
	//	=======
		$R.getFromExtension__options = function ()
		{
			//	include

	//	encode（编码）
	//	======
		function __encodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == '') { return 'none'; }

			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		}


	//	decode（解码除了none字符外的字符）
	//	======
		function __decodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == 'none') { return ''; }

			//	decode
			return decodeURIComponent(_string);
		}




	//	__encodeURIComponentForReadable must be defined（默认选项）

	var __default_options =
	{
		'text_font': 			__encodeURIComponentForReadable('"PT Serif"'),
		'text_font_header': 	__encodeURIComponentForReadable('"PT Serif"'),
		'text_font_monospace': 	__encodeURIComponentForReadable('Inconsolata'),
		'text_size': 			__encodeURIComponentForReadable('16px'),
		'text_line_height': 	__encodeURIComponentForReadable('1.5em'),
		'box_width': 			__encodeURIComponentForReadable('36em'),
		'color_background': 	__encodeURIComponentForReadable('#f3f2ee'),
		'color_text': 			__encodeURIComponentForReadable('#1f0909'),
		'color_links': 			__encodeURIComponentForReadable('#065588'),
		'text_align': 			__encodeURIComponentForReadable('normal'),
		'base': 				__encodeURIComponentForReadable('theme-1'),
		'footnote_links': 		__encodeURIComponentForReadable('on_print'),
		'large_graphics': 		__encodeURIComponentForReadable('do_nothing'),
		'custom_css': 			__encodeURIComponentForReadable(''
								+ '#text blockquote { border-color: #bababa; color: #656565; }'
								+ '#text thead { background-color: #dadada; }'
								+ '#text tr:nth-child(even) { background: #e8e7e7; }'
								)
	};


			//	do
			$R.options = {};
			for (var _x in __default_options)
			{
				var
					_$element = $R.$document.find('#__readable_option__'+_x),
					_value = _$element.html()
				;

				//	set
				$R.options[_x] = (_value > '' ? _value : __default_options[_x]);
			}
		};


	//	vars
	//	====
		$R.getFromExtension__vars = function ()
		{
			//	include

	//	encode
	//	======
		function __encodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == '') { return 'none'; }

			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		}


	//	decode
	//	======
		function __decodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == 'none') { return ''; }

			//	decode
			return decodeURIComponent(_string);
		}




	//	__encodeURIComponentForReadable must be defined（默认参数）

	var __default_vars =
	{
		'theme': 				__encodeURIComponentForReadable('theme-1'),

		'keys_activation': 		__encodeURIComponentForReadable('Control + Alt + Right Arrow'),
		'keys_clip': 			__encodeURIComponentForReadable('Control + Alt + Up Arrow'),
		'clip_tag': 			__encodeURIComponentForReadable(''),

		'custom_theme_options':	__encodeURIComponentForReadable('')
	};


			//	do
			$R.vars = {};
			for (var _x in __default_vars)
			{
				var
					_$element = $R.$document.find('#__readable_var__'+_x),
					_value = _$element.html()
				;

				//	set
				$R.vars[_x] = __decodeURIComponentForReadable(_value > '' ? _value : __default_vars[_x]);
			}
		};


	//	translations
	//	============
		$R.getFromExtension__translations = function ()
		{
			//	include

	//	encode
	//	======
		function __encodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == '') { return 'none'; }

			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		}


	//	decode
	//	======
		function __decodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == 'none') { return ''; }

			//	decode
			return decodeURIComponent(_string);
		}




			for (var _x in $R.translations)
			{
				var
					_$element = $R.$document.find('#__readable_translation__'+_x),
					_value = _$element.html()
				;

				//	set
				if (_value > '') { $R.translations[_x] = __decodeURIComponentForReadable(_value); }
			}
		};


        $R.getFromExtension__translations();
        $R.getFromExtension__vars();
        $R.getFromExtension__options();


		//	RUN: inside frame（运行：内部框架）
		//	================

    (function ()
    {
        //  __escapeForHTML

    //  escapeForHTML
    //  =============
        function __escapeForHTML(_string)
        {
            var _replace = {
                "&": "amp",
                '"': "quot",
                "<": "lt",
                ">": "gt"
            };

            return _string.replace(
                /[&"<>]/g,
                function (_match) { return ("&" + _replace[_match] + ";"); }
            );
        }


        //  create
        $('#bodyContent').html(''

        +	'<div id="curtains">'

        +		($R.debug ? ''
        +		'<div id="curtain__debug" class="curtain">'
        +			'<div class="setBoxWidth"><div class="setBoxWidthInner">'
        +				'<div class="curtainCanvas">'
        +					'<table id="debugOutput"></table>'
        +				'</div>'
        +			'</div></div>'
        +			'<div class="curtainShading"></div>'
        +			'<a href="#" class="curtainCloseButton"></a>'
        +		'</div>' : '')

        +		'<div id="curtain__tips" class="curtain">'
        +			'<div class="setBoxWidth"><div class="setBoxWidthInner">'
        +				'<div class="curtainCanvas">'
        +					'<div id="curtain__tips__logo"></div>'
        +					'<div id="curtain__tips__heading">' + __escapeForHTML($R.translate('blank_error__heading')) + '</div>'
        +					'<div id="curtain__tips__body">' + __escapeForHTML($R.translate('blank_error__body')) + '</div>'
        +				'</div>'
        +			'</div></div>'
        +			'<div class="curtainShading"></div>'
        +			'<a href="#" class="curtainCloseButton"></a>'
        +		'</div>'

        +		'<div id="curtain__rtl" class="curtain">'
        +			'<div class="setBoxWidth"><div class="setBoxWidthInner">'
        +				'<div class="curtainCanvas">'
        +					__escapeForHTML($R.translate('rtl__main__label'))
        +					'<input  id="curtain__rtl__radio__ltr" type="radio" name="curtain__rtl__radio_input" checked="checked"/>'
        +					'<label for="curtain__rtl__radio__ltr">' + __escapeForHTML($R.translate('rtl__ltr__label')) + '</label>'
        +					'<input  id="curtain__rtl__radio__rtl" type="radio" name="curtain__rtl__radio_input"/>'
        +					'<label for="curtain__rtl__radio__rtl">' + __escapeForHTML($R.translate('rtl__rtl__label')) + '</label>'
        +				'</div>'
        +			'</div></div>'
        +			'<div class="curtainShading"></div>'
        +			'<a href="#" class="curtainCloseButton"></a>'
        +		'</div>'

        +	'</div>'

        +	'<div id="box">'
        +		'<div id="box_inner">'
        +			'<div id="text">'
        +				'<div id="pages"></div>'
        +				'<ol id="footnotedLinks"></ol>'
        +			'</div>'
        +		'</div>'
        +	'</div>'

        +	'<div id="background"><div id="background_shading"></div></div>'
        +	'<div id="fitts" title="' + __escapeForHTML($R.translate('fitts__tooltip')) + '"></div>'
        +	'<div id="loading"><div id="loading_spinner"></div></div>'
        +	'<div id="dialogs_overlay"></div>'
        +	'<div id="next_pages_container"></div>'

        +	'<div id="blank_error">'
        +		'<table cellspacing="0" cellpadding="0" border="0" id="blank_error__table"><tr><td id="blank_error__td">'
        +			'<div id="blank_error__text">'
        +				'<div id="blank_error__logo"></div>'
        +				'<div id="blank_error__heading">' + __escapeForHTML($R.translate('blank_error__heading')) + '</div>'
        +				'<div id="blank_error__body">' + __escapeForHTML($R.translate('blank_error__body')) + '</div>'
        +			'</div>'
        +		'</td></tr></table>'
        +	'</div>'

        +	'<div id="sidebar">'

        +		'<div id="sidebar_menu">'
        +			'<a id="sidebar_menu__close" title="' + __escapeForHTML($R.translate('menu__close__tooltip')) + ' (Escape'+(($R.vars && $R.vars['keys_activation'] > '') ? ', ' + __escapeForHTML($R.vars['keys_activation']) : '') + ')' + '" href="#"></a>'
        +			'<a id="sidebar_menu__clip_to_evernote" title="' + __escapeForHTML($R.translate('menu__clip_to_evernote__tooltip')) + (($R.vars && $R.vars['keys_clip'] > '') ? ' (' + __escapeForHTML($R.vars['keys_clip']) + ')' : '') + '" href="#"></a>'
        +			'<a id="sidebar_menu__settings" title="' + __escapeForHTML($R.translate('menu__settings__tooltip')) + '" href="#"></a>'
        +			'<a id="sidebar_menu__print" title="' + __escapeForHTML($R.translate('menu__print__tooltip')) + ' ('+($R.mac ? 'Command' : 'Control') + ' P)' + '" href="#"></a>'
        +		'</div>'

        +		'<div id="sidebar_dialogs">'

                //	clip notifications
                //	==================

        +			'<div class="dialog" id="dialog__clip__doing"><div class="dialog_canvas">'
        +				'<div id="dialog__clip__doing__icon"></div>'
        +				'<div id="dialog__clip__doing__label" class="theFont">' + __escapeForHTML($R.translate('evernote_clipping')) + '</div>'
        +			'</div><div class="dialog_cover"></div></div>'

        +			'<div class="dialog" id="dialog__clip__failed"><div class="dialog_canvas">'
        +				'<div id="dialog__clip__failed__icon"></div>'
        +				'<div id="dialog__clip__failed__label" class="theFont">' + __escapeForHTML($R.translate('evernote_clipping_failed')) + '</div>'
        +			'</div><div class="dialog_cover"></div></div>'

                //	clip login
                //	==========


        +			'<div class="dialog" id="dialog__clip__login"><div class="dialog_canvas">'
        +				'<div id="evernote_login__container" class="theFont">'

        +					'<a id="evernote_login__logo" href="http://www.evernote.com/" target="_blank"></a>'

        +					'<input id="evernote_login__username" class="dialogInput theFont" type="text" maxlength="64" tabindex="1" value=""/>'
        +					'<label id="evernote_login__username__label" class="dialogInput">' + __escapeForHTML($R.translate('evernote_login__username__label')) + '</label>'
        +					'<div id="evernote_login__username__error" class="dialogInput dialogError"></div>'

        +					'<input id="evernote_login__password" class="dialogInput theFont" type="password" maxlength="64" tabindex="2" value=""/>'
        +					'<label id="evernote_login__password__label" class="dialogInput">' + __escapeForHTML($R.translate('evernote_login__password__label')) + '</label>'
        +					'<div id="evernote_login__password__error" class="dialogInput dialogError"></div>'

        +					'<div id="evernote_login__rememberMe__container" class="theFont">'
        +						'<input id="evernote_login__rememberMe" type="checkbox" tabindex="3" value="1" checked="true"/>'
        +						'<label for="evernote_login__rememberMe">' + __escapeForHTML($R.translate('evernote_login__rememberMe__label')) + '</label>'
        +					'</div>'

        +					'<div id="evernote_login__buttons__container" class="theFont">'
        +						'<input type="button" class="floatingButton dialogButton theFont" id="evernote_login__button_do" tabindex="4" value="' + __escapeForHTML($R.translate('evernote_login__button_do__label')) + '"/>'
        +						'<a id="evernote_login__register" class="floatingButton" href="https://www.evernote.com/Registration.action?code=clearly" target="_blank">' + __escapeForHTML($R.translate('evernote_login__create_account')) + '</a>'
        +					'</div>'

        +					'<div id="evernote_login__spinner"></div>'
        +				'</div>'
        +			'</div></div>'


                //	clip frame
                //	==========



                //	settings
                //	========


        +			'<div class="dialog" id="dialog__settings__4"><div class="dialog_canvas">'
        +				'<div id="settings__4">'

        +					'<a id="settings__4__1" class="themeBox">'
        +						'<div class="themeThumbnail"></div>'
        +						'<div class="themeTitle">' + __escapeForHTML($R.translate('settings__theme__1')) + '</div>'
        +					'</a>'
        +					'<a id="settings__4__2" class="themeBox">'
        +						'<div class="themeThumbnail"></div>'
        +						'<div class="themeTitle">' + __escapeForHTML($R.translate('settings__theme__2')) + '</div>'
        +					'</a>'
        +					'<a id="settings__4__3" class="themeBox">'
        +						'<div class="themeThumbnail"></div>'
        +						'<div class="themeTitle">' + __escapeForHTML($R.translate('settings__theme__3')) + '</div>'
        +					'</a>'
        +					'<a id="settings__4__custom" class="themeBox">'
        +						'<div class="themeThumbnail"></div>'
        +						'<div class="themeTitle">' + __escapeForHTML($R.translate('settings__theme__custom')) + '</div>'
        +					'</a>'

        +					'<div id="settings__4__separator" class="settingsSeparator"></div>'

        +					'<div class="fontSizeButtons" id="settings__4__fontSizeButtons">'
        +						'<a id="settings__4__fontSize__small" class="fontSizeButton fontSizeSmall">'
        +							'<div class="fontSizeLabel">' + __escapeForHTML($R.translate('settings__fontSize__small')) + '</div>'
        +						'</a>'
        +						'<a id="settings__4__fontSize__medium" class="fontSizeButton fontSizeMedium">'
        +							'<div class="fontSizeLabel">' + __escapeForHTML($R.translate('settings__fontSize__medium')) + '</div>'
        +						'</a>'
        +						'<a id="settings__4__fontSize__large" class="fontSizeButton fontSizeLarge">'
        +							'<div class="fontSizeLabel">' + __escapeForHTML($R.translate('settings__fontSize__large')) + '</div>'
        +						'</a>'
        +					'</div>'

        +				'</div>'
        +			'</div></div>'


        +		'</div>'
        +	'</div>'
        );
    })();


	//	get vars
	//	========
    $R.$box = $('#box');    // 盛装提取内容后的盒子
    $R.$fitts = $('#fitts');
    $R.$background = $('#background');  // 整个页面的遮盖层
    $R.$backgroundShading = $('#background_shading');
    $R.$loading = $('#loading');        // 载入层
    $R.$dialogsOverlay = $('#dialogs_overlay');
    $R.$nextPages = $('#next_pages_container'); // 下一页
    $R.$sidebar = $('#sidebar');        //  工具栏

    $R.$iframeText = $('#text');    // 内容区域里的文本盒子
    $R.$pages = $('#pages');        // 下面全是文本了
    $R.$footnotedLinks = $('#footnotedLinks');  // 链接列表


		//	options
		//	======

	//	var
	//	===

    //	$R.options holds the options to be applied
    //	$R.appliedOptions holds the options currently applied
    //	_optionsToApply holds the decoded options that will actually be applied
    //	$R.loadedGoogleFonts holds the  currently loaded Google fonts URLs

    $R.appliedOptions = {};     //  初始化
    $R.loadedGoogleFonts = {};  //  导入GOOGLE字库

	//	apply options
	//	=============
		$R.applyOptions__fonts = function () {};
		$R.applyOptions = function ()
		{
			//	include defaults
			//	================

	//	encode
	//	======
		function __encodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == '') { return 'none'; }

			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		}


	//	decode
	//	======
		function __decodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == 'none') { return ''; }

			//	decode
			return decodeURIComponent(_string);
		}




	//	__encodeURIComponentForReadable must be defined

	var __default_options =
	{
		'text_font': 			__encodeURIComponentForReadable('"PT Serif"'),
		'text_font_header': 	__encodeURIComponentForReadable('"PT Serif"'),
		'text_font_monospace': 	__encodeURIComponentForReadable('Inconsolata'),
		'text_size': 			__encodeURIComponentForReadable('16px'),
		'text_line_height': 	__encodeURIComponentForReadable('1.5em'),
		'box_width': 			__encodeURIComponentForReadable('36em'),
		'color_background': 	__encodeURIComponentForReadable('#f3f2ee'),
		'color_text': 			__encodeURIComponentForReadable('#1f0909'),
		'color_links': 			__encodeURIComponentForReadable('#065588'),
		'text_align': 			__encodeURIComponentForReadable('normal'),
		'base': 				__encodeURIComponentForReadable('theme-1'),
		'footnote_links': 		__encodeURIComponentForReadable('on_print'),
		'large_graphics': 		__encodeURIComponentForReadable('do_nothing'),
		'custom_css': 			__encodeURIComponentForReadable(''
								+ '#text blockquote { border-color: #bababa; color: #656565; }'
								+ '#text thead { background-color: #dadada; }'
								+ '#text tr:nth-child(even) { background: #e8e7e7; }'
								)
	};



    //	null or blank
    //	=============
    if ($R.options); else { $R.options = {}; }

    for (var _option in __default_options)
    {
        switch (true)
        {
            case (!(_option in $R.options)):
            case (!($R.options[_option] > '')):
                $R.options[_option] = __default_options[_option];
                break;
        }
    }


    //	what to do
    //	==========

    var
        _resetOptions = false,
        _resetBase = false,
        _optionsToApply = {}
    ;

    //	set _resetBase
    switch (true)
    {
        case (!('base' in  $R.appliedOptions)):
        case (!($R.options['base'] == $R.appliedOptions['base'])):
            _resetBase = true;
            break;
    }

    //	set _resetOptions
    for (var _option in __default_options)
    {
        switch (true)
        {
            case (!(_option in $R.appliedOptions)):
            case (!($R.options[_option] == $R.appliedOptions[_option])):
                _resetOptions = true;
                break;
        }

        //	stop
        if (_resetOptions) { break; }
    }


    //	set appliedOptions
    //	set optionToApply
    //	=================
    for (var _option in __default_options)
    {
        $R.appliedOptions[_option] = $R.options[_option];
        _optionsToApply[_option] = __decodeURIComponentForReadable($R.options[_option]);
    }


			//	apply base
			//	==========
				if (_resetBase)
				{
					//	remove old
					$('#baseCSS').remove();

					//	add new
					if (_optionsToApply['base'] > '')
					{
						$('head').append(''
							+ '<link id="baseCSS" href="'
							+ $R.paths['main'] + 'css/' + $R.versioning['file_name_base--'+_optionsToApply['base']+'_css']
							+ '" rel="stylesheet" type="text/css" />'
						);
					}
				}


    //	set the css
    //	===========
    if (_resetOptions)
    {

	function __options__get_css (_options)
	{
		var _cssText = (''
		+	'#body { '
		+		'font-family: [=text_font]; '
		+		'font-size: [=text_size]; '
		+		'line-height: [=text_line_height]; '
		+		'color: [=color_text]; '
		+		'text-align: '+(_options['text_align'] == 'justified' ? 'justify' : 'left')+'; '
		+	'} '

		+	'#background { background-color: [=color_background]; } '

		+	'.setTextColorAsBackgroundColor { background-color: [=color_text]; } '
		+	'.setBackgroundColorAsTextColor { color: [=color_background]; } '

		+	'#box, .setBoxWidth { width: [=box_width]; } '

		+	'a { color: [=color_links]; } '
		+	'a:visited { color: [=color_text]; } '

		+	'@media print { body.footnote_links__on_print a, body.footnote_links__on_print a:hover { color: [=color_text] !important; text-decoration: none !important; } } '
		+	'body.footnote_links__always a, body.footnote_links__always a:hover { color: [=color_text] !important; text-decoration: none !important; } '

		+	'img { border-color: [=color_text]; } '
		+	'a img { border-color: [=color_links]; } '
		+	'a:visited img { border-color: [=color_text]; } '

		+	'h1 a, h2 a, a h1, a h2 { color: [=color_text]; } '
		+	'h1, h2, h3, h4, h5, h6 { font-family: [=text_font_header]; } '

		+	'pre { background-color: [=color_background]; } '
		+	'pre, code { font-family: [=text_font_monospace]; } '
		+	'hr { border-color: [=color_text]; } '

		+	'#rtl_box { background-color: [=color_text]; color: [=color_background]; } '
		+	'#rtl_box a { color: [=color_background]; } '

		+	'html.rtl #body #text { text-align: ' + (_options['text_align'] == 'justified' ? 'justify' : 'right')+' !important; } '
		+	'h1, h2, h3, h4, h5, h6 { text-align: left; } '
		+	'html.rtl h1, html.rtl h2, html.rtl h3, html.rtl h4, html.rtl h5, html.rtl h6 { text-align: right !important; } '

		+	'[=custom_css] '
		).replace(
			/\[=([a-z_]+?)\]/gi,
			function (_match, _key) { return _options[_key]; }
		);

		return _cssText;
	}
    var _cssText = __options__get_css(_optionsToApply);

    //	remove old
    //	==========
    $('#optionsCSS').remove();

    //	new
    //	===
    var _cssElement = document.createElement('style');
        _cssElement.setAttribute('type', 'text/css');
        _cssElement.setAttribute('id', 'optionsCSS');

    if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
        else { _cssElement.appendChild(document.createTextNode(_cssText)); }

    $('head').append(_cssElement);

    //	body classes
    //	============
    $('body')
        .removeClass('footnote_links__on_print footnote_links__always footnote_links__never')
        .removeClass('large_graphics__do_nothing large_graphics__hide_on_print large_graphics__hide_always')
        .addClass('footnote_links__'+_optionsToApply['footnote_links'])
        .addClass('large_graphics__'+_optionsToApply['large_graphics'])
    ;
    }


			//	google fonts
			//	============
				var _fontsFunction = function ()
				{
					//	skip?
					if (_resetOptions); else { return; }

					//	get

	function __options__get_google_fonts (_options)
	{

	var
		__google_fonts_index = {},
		__google_fonts_array =
		[
			'Arvo',
			'Bentham',
			'Cardo',
			'Copse',
			'Corben',
			'Crimson Text',
			'Droid Serif',
			'Goudy Bookletter 1911',
			'Gruppo',
			'IM Fell',
			'Josefin Slab',
			'Kreon',
			'Meddon',
			'Merriweather',
			'Neuton',
			'OFL Sorts Mill Goudy TT',
			'Old Standard TT',
			'Philosopher',
			'PT Serif',
			'Radley',
			'Tinos',
			'Vollkorn',

			'Allerta',
			'Anton',
			'Arimo',
			'Bevan',
			'Buda',
			'Cabin',
			'Cantarell',
			'Coda',
			'Cuprum',
			'Droid Sans',
			'Geo',
			'Josefin Sans',
			'Lato',
			'Lekton',
			'Molengo',
			'Nobile',
			'Orbitron',
			'PT Sans',
			'Puritan',
			'Raleway',
			'Syncopate',
			'Ubuntu',
			'Yanone Kaffeesatz',

			'Anonymous Pro',
			'Cousine',
			'Droid Sans Mono',
			'Inconsolata'
		];

	//	create index
	for (var i=0, ii=__google_fonts_array.length; i<ii; i++){
		__google_fonts_index[__google_fonts_array[i]] = 1;
	}


		var
			_fonts = {},
			_fonts_urls = [],
			_check_font = function (_match, _font)
				{ if (_font in __google_fonts_index) { _fonts[_font] = 1; } }
		;

		//	body
		//	====
			_options['text_font'].replace(/"([^",]+)"/gi, _check_font);
			_options['text_font'].replace(/([^",\s]+)/gi, _check_font);

		//	headers
		//	=======
			_options['text_font_header'].replace(/"([^",]+)"/gi, _check_font);
			_options['text_font_header'].replace(/([^",\s]+)/gi, _check_font);

		//	monospace
		//	=========
			_options['text_font_monospace'].replace(/"([^",]+)"/gi, _check_font);
			_options['text_font_monospace'].replace(/([^",\s]+)/gi, _check_font);

		//	custom css
		//	==========
			_options['custom_css'].replace(/font-family: "([^",]+)"/gi, _check_font);
			_options['custom_css'].replace(/font-family: ([^",\s]+)/gi, _check_font);


		//	return
		//	======

			//	transform to array
			for (var _font in _fonts)
			{
				_fonts_urls.push(''
					+ 'http://fonts.googleapis.com/css?family='
					+ _font.replace(/\s+/g, '+')
					+ ':regular,bold,italic'
				);
			}

			//	return
			return _fonts_urls;
	}

					var _fonts_urls = __options__get_google_fonts(_optionsToApply);

					//	apply
					for (var i=0,_i=_fonts_urls.length; i<_i; i++)
					{
						//	loaded?
						if ($R.loadedGoogleFonts[_fonts_urls[i]]) { continue; }

						//	load
						$('head').append('<link href="'+_fonts_urls[i]+'" rel="stylesheet" type="text/css" />');

						//	mark
						$R.loadedGoogleFonts[_fonts_urls[i]] = 1;
					}
				};

				$R.applyOptions__fonts = function () { _fontsFunction.call(); };
		};


		//	dialogs
		//	=======

	//	vars
	//	====
		$R.openDialogID = false;

	//	show（显示对话框）
	//	====
		$R.showDialog = function (_dialog_id)
		{
			$R.hideOpenDialog();

			$R.$dialogsOverlay.show();
			$('#dialog__'+_dialog_id).show();

			$R.openDialogID = _dialog_id;
		};

	//	hide（隐藏对话框）
	//	====
		$R.hideDialog = function (_dialog_id)
		{
			//	the dialog
			$('#dialog__'+_dialog_id).hide();

			//	the overlay
			$R.$dialogsOverlay.hide();

			//	if current, unset
			$R.openDialogID = ($R.openDialogID == _dialog_id ? '' : $R.openDialogID);
		};


	//	hide open
	//	=========
		$R.hideOpenDialog = function ()
		{
			if ($R.openDialogID > ''); else { return; }

			//	hide
			$R.hideDialog($R.openDialogID);

			//	clear current
			$R.openDialogID = '';
		};


	//	events
	//	======

		//	overlay hide current
		$R.$dialogsOverlay.click(function ()
		{
			$R.hideOpenDialog();
			return false;
		});

		//	small dialogs -- hide on click
		$('#dialog__clip__doing div.dialog_cover, #dialog__clip__failed div.dialog_cover').click(function ()
		{
			$R.hideOpenDialog();
			return false;
		});


	//	curtains
	//	========
		$('#curtains a.curtainCloseButton').click(function(){
			$(this.parentNode).hide();
			return false;
		});



	//	events
	//	======

		//	click labls => show inputs
		$('#evernote_login__username__label').click(function () { $('#evernote_login__username__label').hide(); $('#evernote_login__username').get(0).focus(); return false; });
		$('#evernote_login__password__label').click(function () { $('#evernote_login__password__label').hide(); $('#evernote_login__password').get(0).focus(); return false; });

		//	leave input => show labels
		$('#evernote_login__username').blur(function () { if ($('#evernote_login__username').val() == '') { $('#evernote_login__username__label').show(); } return false; });
		$('#evernote_login__password').blur(function () { if ($('#evernote_login__password').val() == '') { $('#evernote_login__password__label').show(); } return false; });

		//	click errors => show inputs
		$('#evernote_login__username__error').click(function () { $('#evernote_login__container').removeClass('showUsernameError'); $('#evernote_login__username__label').hide(); $('#evernote_login__username').get(0).focus(); return false; });
		$('#evernote_login__password__error').click(function () { $('#evernote_login__container').removeClass('showPasswordError'); $('#evernote_login__password__label').hide(); $('#evernote_login__password').get(0).focus(); return false; });

		//	click button
		$('#evernote_login__button_do').click(function() { $R.evernoteLogin__submit(); return false; });

		//	enter to submit
		$('#evernote_login__username, #evernote_login__password').keydown(function (_event)	{ if (_event.keyCode == '13'); else { return; } $R.evernoteLogin__submit(); return false; });

		//	tab to password
		$('#evernote_login__username').keydown(function (_event) { if (_event.keyCode == '9'); else { return; } $('#evernote_login__container').removeClass('showPasswordError'); $('#evernote_login__password__label').hide(); $('#evernote_login__password').get(0).focus(); return false; });


	//	submit（开始登录）
	//	======
		$R.evernoteLogin__submit = function ()
		{
			var
				_username = $('#evernote_login__username').val(),
				_password = $('#evernote_login__password').val()
			;

            //  __escapeForHTML

    //  escapeForHTML
    //  =============
        function __escapeForHTML(_string)
        {
            var _replace = {
                "&": "amp",
                '"': "quot",
                "<": "lt",
                ">": "gt"
            };

            return _string.replace(
                /[&"<>]/g,
                function (_match) { return ("&" + _replace[_match] + ";"); }
            );
        }


			//	remove errors
			$('#evernote_login__container').removeClass('showUsernameError showPasswordError');

			// check username
			switch (true)
			{
				case (!(_username.length >= 1)):
					$('#evernote_login__username__error').html(__escapeForHTML($R.translate('evernote_login__username__error__required')));
					$('#evernote_login__container').addClass('showUsernameError');
					return;

				case (!(_username.length <= 64)):
					$('#evernote_login__username__error').html(__escapeForHTML($R.translate('evernote_login__username__error__length')));
					$('#evernote_login__container').addClass('showUsernameError');
					return;

				case (!(/^[a-z0-9]([a-z0-9_-]{0,62}[a-z0-9])?$/gi.test(_username))):
					//	using email instead
					if (_username.indexOf('@') > -1 && _username.indexOf(' ') == -1) { break; }

					//	do error
					$('#evernote_login__username__error').html(__escapeForHTML($R.translate('evernote_login__username__error__format')));
					$('#evernote_login__container').addClass('showUsernameError');
					return;
			}

			// check password
			switch (true)
			{
				case (!(_password.length >= 1)):
					$('#evernote_login__password__error').html(__escapeForHTML($R.translate('evernote_login__password__error__required')));
					$('#evernote_login__container').addClass('showPasswordError');
					return;

				case (!(_password.length >= 6)):
				case (!(_password.length <= 64)):
					$('#evernote_login__password__error').html(__escapeForHTML($R.translate('evernote_login__password__error__length')));
					$('#evernote_login__container').addClass('showPasswordError');
					return;

				case (!(/^[A-Za-z0-9!#$%&'()*+,.\/:;<=>?@^_`{|}~\[\]\\-]{6,64}$/gi.test(_password))):
					$('#evernote_login__password__error').html(__escapeForHTML($R.translate('evernote_login__password__error__format')));
					$('#evernote_login__container').addClass('showPasswordError');
					return;
			}

			//	spinner
			$('#evernote_login__container').addClass('showSpinner');

			//	event
			$R.customEvents.dispatch(
				$R.customEvents.names_to_objects['to-extension--evernote-login'],
				$R.document,
				$R.win
			);
		};


	//	select theme（选择主题）
	//	============
		var __select_theme_from_menu = function (_theme_id)
		{
			//	the themes

	//	encode
	//	======
		function __encodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == '') { return 'none'; }

			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		}


	//	decode
	//	======
		function __decodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == 'none') { return ''; }

			//	decode
			return decodeURIComponent(_string);
		}




	//	__encodeURIComponentForReadable must be defined

	var __the_themes =
	{
		'theme-1':
		{
			'text_font': 			__encodeURIComponentForReadable('"PT Serif"'),
			'text_font_header': 	__encodeURIComponentForReadable('"PT Serif"'),
			'text_font_monospace': 	__encodeURIComponentForReadable('Inconsolata'),
			'text_size': 			__encodeURIComponentForReadable('16px'),
			'text_line_height': 	__encodeURIComponentForReadable('1.5em'),
			'box_width': 			__encodeURIComponentForReadable('36em'),
			'color_background': 	__encodeURIComponentForReadable('#f3f2ee'),
			'color_text': 			__encodeURIComponentForReadable('#1f0909'),
			'color_links': 			__encodeURIComponentForReadable('#065588'),
			'text_align': 			__encodeURIComponentForReadable('normal'),
			'base': 				__encodeURIComponentForReadable('theme-1'),
			'footnote_links': 		__encodeURIComponentForReadable('on_print'),
			'large_graphics': 		__encodeURIComponentForReadable('do_nothing'),
			'custom_css': 			__encodeURIComponentForReadable(''
									+ '#text blockquote { border-color: #bababa; color: #656565; }'
									+ '#text thead { background-color: #dadada; }'
									+ '#text tr:nth-child(even) { background: #e8e7e7; }'
									+ '#text hr { border-color: #c5c5c5; }'
									)
		},

		'theme-2':
		{
			'text_font': 			__encodeURIComponentForReadable('Helvetica, Arial'),
			'text_font_header': 	__encodeURIComponentForReadable('Helvetica, Arial'),
			'text_font_monospace': 	__encodeURIComponentForReadable('"Droid Sans Mono"'),
			'text_size': 			__encodeURIComponentForReadable('14px'),
			'text_line_height': 	__encodeURIComponentForReadable('1.5em'),
			'box_width': 			__encodeURIComponentForReadable('42em'),
			'color_background': 	__encodeURIComponentForReadable('#fff'),
			'color_text': 			__encodeURIComponentForReadable('#333'),
			'color_links': 			__encodeURIComponentForReadable('#090'),
			'text_align': 			__encodeURIComponentForReadable('normal'),
			'base': 				__encodeURIComponentForReadable('theme-2'),
			'footnote_links': 		__encodeURIComponentForReadable('on_print'),
			'large_graphics': 		__encodeURIComponentForReadable('do_nothing'),
			'custom_css': 			__encodeURIComponentForReadable(''
									+ '#text h1 { color: #000; }'
									+ '#text h2, #text h3, #text h4, #text h5, #text h6 { color: #444; }'
									+ '#text blockquote { border-color: #d1d1d1; }'
									+ '#text thead { background-color: #444; color: #fff; }'
									+ '#text tr:nth-child(even) { background: #d1d1d1; }'
									+ '#text hr { border-color: #000; }'
									)
		},

		'theme-3':
		{
			'text_font': 			__encodeURIComponentForReadable('"PT Serif"'),
			'text_font_header': 	__encodeURIComponentForReadable('"PT Serif"'),
			'text_font_monospace': 	__encodeURIComponentForReadable('Inconsolata'),
			'text_size': 			__encodeURIComponentForReadable('16px'),
			'text_line_height': 	__encodeURIComponentForReadable('1.5em'),
			'box_width': 			__encodeURIComponentForReadable('36em'),
			'color_background': 	__encodeURIComponentForReadable('#2d2d2d'),
			'color_text': 			__encodeURIComponentForReadable('#e3e3e3'),
			'color_links': 			__encodeURIComponentForReadable('#e3e3e3'),
			'text_align': 			__encodeURIComponentForReadable('normal'),
			'base': 				__encodeURIComponentForReadable('theme-3'),
			'footnote_links': 		__encodeURIComponentForReadable('on_print'),
			'large_graphics': 		__encodeURIComponentForReadable('do_nothing'),
			'custom_css': 			__encodeURIComponentForReadable(''
									+ '#text a:link { -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; }'
									+ '#text a:hover, #text a:active {	color: #44bde8; }'
									+ '#text blockquote { color: #c1bfbf; border-color: #c1bfbf; }'
									+ '#text thead { background-color: #4f4f4f; }'
									+ '#text tr:nth-child(even) { background: #404040; }'
									+ '#text hr { border-color: #c5c5c5; }'
									)
		}
	};

			//	set var
			$R.vars['theme'] = _theme_id;

			//	event
			$R.customEvents.dispatch(
				$R.customEvents.names_to_objects['to-extension--select-'+_theme_id],
				$R.document,
				$R.win
			);

			//	set theme
			for (var _v in __the_themes[_theme_id])
				{ $R.options[_v] = __the_themes[_theme_id][_v];	}

			//	apply options
			$R.applyOptions();

			//	deselect all -- will be selected for each item
			$('#settings__4 a.themeBox').removeClass('selected');

			//	deselct font size; select medium
			$('#settings__4__fontSizeButtons a.fontSizeButton').removeClass('selected');
			$('#settings__4__fontSize__medium').addClass('selected');
		};//选择主题结束

        // 然后从菜单中自定义的主题
		var __select_theme_from_menu__custom = function ()
		{
			//	the themes

	//	encode
	//	======
		function __encodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == '') { return 'none'; }

			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		}


	//	decode
	//	======
		function __decodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == 'none') { return ''; }

			//	decode
			return decodeURIComponent(_string);
		}




	//	__encodeURIComponentForReadable must be defined
    // 主题信息
	var __the_themes =
	{
		'theme-1':
		{
			'text_font': 			__encodeURIComponentForReadable('"PT Serif"'),
			'text_font_header': 	__encodeURIComponentForReadable('"PT Serif"'),
			'text_font_monospace': 	__encodeURIComponentForReadable('Inconsolata'),
			'text_size': 			__encodeURIComponentForReadable('16px'),
			'text_line_height': 	__encodeURIComponentForReadable('1.5em'),
			'box_width': 			__encodeURIComponentForReadable('36em'),
			'color_background': 	__encodeURIComponentForReadable('#f3f2ee'),
			'color_text': 			__encodeURIComponentForReadable('#1f0909'),
			'color_links': 			__encodeURIComponentForReadable('#065588'),
			'text_align': 			__encodeURIComponentForReadable('normal'),
			'base': 				__encodeURIComponentForReadable('theme-1'),
			'footnote_links': 		__encodeURIComponentForReadable('on_print'),
			'large_graphics': 		__encodeURIComponentForReadable('do_nothing'),
			'custom_css': 			__encodeURIComponentForReadable(''
									+ '#text blockquote { border-color: #bababa; color: #656565; }'
									+ '#text thead { background-color: #dadada; }'
									+ '#text tr:nth-child(even) { background: #e8e7e7; }'
									+ '#text hr { border-color: #c5c5c5; }'
									)
		},

		'theme-2':
		{
			'text_font': 			__encodeURIComponentForReadable('Helvetica, Arial'),
			'text_font_header': 	__encodeURIComponentForReadable('Helvetica, Arial'),
			'text_font_monospace': 	__encodeURIComponentForReadable('"Droid Sans Mono"'),
			'text_size': 			__encodeURIComponentForReadable('14px'),
			'text_line_height': 	__encodeURIComponentForReadable('1.5em'),
			'box_width': 			__encodeURIComponentForReadable('42em'),
			'color_background': 	__encodeURIComponentForReadable('#fff'),
			'color_text': 			__encodeURIComponentForReadable('#333'),
			'color_links': 			__encodeURIComponentForReadable('#090'),
			'text_align': 			__encodeURIComponentForReadable('normal'),
			'base': 				__encodeURIComponentForReadable('theme-2'),
			'footnote_links': 		__encodeURIComponentForReadable('on_print'),
			'large_graphics': 		__encodeURIComponentForReadable('do_nothing'),
			'custom_css': 			__encodeURIComponentForReadable(''
									+ '#text h1 { color: #000; }'
									+ '#text h2, #text h3, #text h4, #text h5, #text h6 { color: #444; }'
									+ '#text blockquote { border-color: #d1d1d1; }'
									+ '#text thead { background-color: #444; color: #fff; }'
									+ '#text tr:nth-child(even) { background: #d1d1d1; }'
									+ '#text hr { border-color: #000; }'
									)
		},

		'theme-3':
		{
			'text_font': 			__encodeURIComponentForReadable('"PT Serif"'),
			'text_font_header': 	__encodeURIComponentForReadable('"PT Serif"'),
			'text_font_monospace': 	__encodeURIComponentForReadable('Inconsolata'),
			'text_size': 			__encodeURIComponentForReadable('16px'),
			'text_line_height': 	__encodeURIComponentForReadable('1.5em'),
			'box_width': 			__encodeURIComponentForReadable('36em'),
			'color_background': 	__encodeURIComponentForReadable('#2d2d2d'),
			'color_text': 			__encodeURIComponentForReadable('#e3e3e3'),
			'color_links': 			__encodeURIComponentForReadable('#e3e3e3'),
			'text_align': 			__encodeURIComponentForReadable('normal'),
			'base': 				__encodeURIComponentForReadable('theme-3'),
			'footnote_links': 		__encodeURIComponentForReadable('on_print'),
			'large_graphics': 		__encodeURIComponentForReadable('do_nothing'),
			'custom_css': 			__encodeURIComponentForReadable(''
									+ '#text a:link { -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; }'
									+ '#text a:hover, #text a:active {	color: #44bde8; }'
									+ '#text blockquote { color: #c1bfbf; border-color: #c1bfbf; }'
									+ '#text thead { background-color: #4f4f4f; }'
									+ '#text tr:nth-child(even) { background: #404040; }'
									+ '#text hr { border-color: #c5c5c5; }'
									)
		}
	};

			//	set var
			$R.vars['theme'] = 'custom';

			//	event
			$R.customEvents.dispatch(
				$R.customEvents.names_to_objects['to-extension--select-theme-custom'],
				$R.document,
				$R.win
			);

			//	set theme
			$R.vars['custom_theme_options'].replace
			(
				/\[\[=(.*?)\]\[=(.*?)\]\]/gi,
				function (_match, _name, _value) { $R.options[_name] = _value; }
			);

			//	apply options
			$R.applyOptions();

			//	deselect all -- will be selected for each item
			$('#settings__4 a.themeBox').removeClass('selected');

			//	deselct font size; select medium
			$('#settings__4__fontSizeButtons a.fontSizeButton').removeClass('selected');
		};//从菜单中自定义的主题


	//	select size（选择字体大小）
	//	===========
		var __select_size_from_menu = function (_size)
		{
			//	the sizes

	//	encode
	//	======
		function __encodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == '') { return 'none'; }

			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		}


	//	decode
	//	======
		function __decodeURIComponentForReadable(_string)
		{
			//	none
			if (_string == 'none') { return ''; }

			//	decode
			return decodeURIComponent(_string);
		}




	var __the_sizes =
	{
		'small':
		{
			'theme-1': '12px',
			'theme-2': '12px',
			'theme-3': '12px',
			'custom':  '12px'
		},

		'medium':
		{
			'theme-1': '16px',
			'theme-2': '16px',
			'theme-3': '16px',
			'custom':  '16px'
		},

		'large':
		{
			'theme-1': '20px',
			'theme-2': '20px',
			'theme-3': '20px',
			'custom':  '20px'
		}
	};


			//	event
			$R.customEvents.dispatch(
				$R.customEvents.names_to_objects['to-extension--select-size-'+_size],
				$R.document,
				$R.win
			);

			//	apply size
			$R.options['text_size'] = __the_sizes[_size][$R.vars['theme']];
			$R.applyOptions();

			//	deselect all
			//	will be selected for each item
			$('#settings__4__fontSizeButtons a.fontSizeButton').removeClass('selected');
		};// 选择字体大小结束


	//	events
	//	======

		//	theme boxes（主题）
		$('#settings__4__1').click(function () { __select_theme_from_menu('theme-1'); $('#settings__4__1').addClass('selected'); });
		$('#settings__4__2').click(function () { __select_theme_from_menu('theme-2'); $('#settings__4__2').addClass('selected'); });
		$('#settings__4__3').click(function () { __select_theme_from_menu('theme-3'); $('#settings__4__3').addClass('selected'); });
		$('#settings__4__custom').click(function ()
		{
			//	show settings
				if ($R.vars['custom_theme_options'] > ''); else
				{
					$R.customEvents.dispatch(
						$R.customEvents.names_to_objects['to-extension--open-settings-theme'],
						$R.document,
						$R.win
					);

					$R.hideOpenDialog();

					return;
				}

			//	apply theme
			//	===========
				__select_theme_from_menu__custom();
				$('#settings__4__custom').addClass('selected');
		});

		//	size buttons（字体大小）
		$('#settings__4__fontSize__small').click(function ()  { __select_size_from_menu('small');  $('#settings__4__fontSize__small').addClass('selected'); });
		$('#settings__4__fontSize__medium').click(function () { __select_size_from_menu('medium'); $('#settings__4__fontSize__medium').addClass('selected'); });
		$('#settings__4__fontSize__large').click(function ()  { __select_size_from_menu('large');  $('#settings__4__fontSize__large').addClass('selected'); });


	//	initially selected（初始化选择）
	//	==================
		(function()
		{
			//	the sizes

	var __the_sizes =
	{
		'small':
		{
			'theme-1': '12px',
			'theme-2': '12px',
			'theme-3': '12px',
			'custom':  '12px'
		},

		'medium':
		{
			'theme-1': '16px',
			'theme-2': '16px',
			'theme-3': '16px',
			'custom':  '16px'
		},

		'large':
		{
			'theme-1': '20px',
			'theme-2': '20px',
			'theme-3': '20px',
			'custom':  '20px'
		}
	};


			//	theme
			switch ($R.vars['theme'])
			{
				case 'theme-1': $('#settings__4__1').addClass('selected'); break;
				case 'theme-2': $('#settings__4__2').addClass('selected'); break;
				case 'theme-3': $('#settings__4__3').addClass('selected'); break;
				case 'custom':  $('#settings__4__custom').addClass('selected'); break;
			}

			//	size
			switch ($R.options['text_size'])
			{
				case __the_sizes['small'][$R.vars['theme']]:  $('#settings__4__fontSize__small').addClass('selected');   break;
				case __the_sizes['medium'][$R.vars['theme']]: $('#settings__4__fontSize__medium').addClass('selected'); break;
				case __the_sizes['large'][$R.vars['theme']]:  $('#settings__4__fontSize__large').addClass('selected');   break;
			}
		})();// 初始化选择


		//	menu
		//	====

	//	var
	//	===
		$R.menu_functions = {};


    //  set handlers
    //  ============
        $('#sidebar_menu__close').click(function() { $R.menu_functions['close'](); return false; });
        $('#sidebar_menu__clip_to_evernote').click(function() { $R.menu_functions['clip_to_evernote'](); return false; });
        $('#sidebar_menu__settings').click(function() { $R.menu_functions['settings'](); return false; });
        $('#sidebar_menu__print').click(function() { $R.menu_functions['print'](); return false; });


    //  set functions
    //  =============

        //	general
		$R.menu_functions['close'] = function () { $R.hide(); return false; };
		$R.menu_functions['print'] = function () { window.print(); return false; };

        //	by target -- overriden by boomarklet and extension code
		$R.menu_functions['settings'] = function () { };
		$R.menu_functions['clip_to_evernote'] = function () { };


	$R.menu_functions['settings'] = function ()
	{
        //  show dialog
        //  ===========
            $R.showDialog('settings__4');

        //  track event
        //  ===========
            $R.customEvents.dispatch(
				$R.customEvents.names_to_objects['to-extension--track--theme-popup'],
				$R.document,
				$R.win
			);

		return false;
	};

	$R.menu_functions['clip_to_evernote'] = function ()
	{
		//	waiting
		$R.showDialog('clip__doing');

		//	event
		$R.customEvents.dispatch(
			$R.customEvents.names_to_objects['to-extension--evernote-clip'],
			$R.document,
			$R.win
		);

		return false;
	};



		//	custom events
		//	=============

	(function()
	{
		//	include events

	/*
		first three variables will be defined
	*/

	var
		__custom_events__names_to_keys = {},
		__custom_events__keys_to_names = {},
		__custom_events__names_to_objects = {},

		__custom_events =
		[
			['to-extension--open-settings', 				'click-110-120-130-140-1-1-1'],
			['to-extension--open-settings-theme', 			'click-111-121-131-141-1-1-1'],

			['to-extension--evernote-clip', 				'click-210-220-230-240-1-1-1'],
			['to-extension--evernote-login', 				'click-310-320-330-340-1-1-1'],

			['to-extension--select-theme-1', 				'click-511-521-531-541-1-1-1'],
			['to-extension--select-theme-2', 				'click-512-522-532-542-1-1-1'],
			['to-extension--select-theme-3', 				'click-513-523-533-543-1-1-1'],
			['to-extension--select-theme-custom', 			'click-514-524-534-544-1-1-1'],

			['to-extension--select-size-small', 			'click-611-621-631-641-1-1-1'],
			['to-extension--select-size-medium', 			'click-612-622-632-642-1-1-1'],
			['to-extension--select-size-large', 			'click-613-623-633-643-1-1-1'],

			['to-extension--track--view', 			        'click-811-821-831-841-1-1-1'],
			['to-extension--track--clip', 			        'click-812-822-832-842-1-1-1'],
			['to-extension--track--theme-popup', 			'click-813-823-833-843-1-1-1'],
			['to-extension--track--settings', 			    'click-814-824-834-844-1-1-1'],


			['to-browser--evernote-login-show', 			'click-411-421-431-441-1-1-1'],
			['to-browser--evernote-login-failed', 			'click-412-422-432-442-1-1-1'],
			['to-browser--evernote-login-failed--username', 'click-413-423-433-443-1-1-1'],
			['to-browser--evernote-login-failed--password', 'click-414-424-434-444-1-1-1'],
			['to-browser--evernote-login-successful', 		'click-415-425-435-445-1-1-1'],

			['to-browser--evernote-clip-successful', 		'click-711-721-731-741-1-1-1'],
			['to-browser--evernote-clip-failed', 			'click-712-722-732-742-1-1-1']
		]
	;

	for (var i=0,_i=__custom_events.length,e=false,k=false; i<_i; i++)
	{
		e = __custom_events[i];
		k = e[1].split('-');

		__custom_events__names_to_keys[e[0]] = e[1];
		__custom_events__keys_to_names[e[1]] = e[0];
		__custom_events__names_to_objects[e[0]] =
		{
			'_1': k[1],
			'_2': k[2],
			'_3': k[3],
			'_4': k[4],
			'_5': (k[5] == 1 ? true : false),
			'_6': (k[6] == 1 ? true : false),
			'_7': (k[7] == 1 ? true : false)
		};
	}

	var __custom_events__get_key = function (_event)
	{
		return 'click'
			+'-'+_event.screenX
			+'-'+_event.screenY
			+'-'+_event.clientX
			+'-'+_event.clientY
			+'-'+(_event.ctrlKey ? 1 : 0)
			+'-'+(_event.altKey ? 1 : 0)
			+'-'+(_event.shiftKey ? 1 : 0)
		;
	};

	var __custom_events__dispatch = function (_custom_event_object, _document, _window)
	{
		var _e = _document.createEvent("MouseEvents");

		_e.initMouseEvent(
			"click", true, true, _window, 0,
			_custom_event_object['_1'], _custom_event_object['_2'], _custom_event_object['_3'], _custom_event_object['_4'],
			_custom_event_object['_5'], _custom_event_object['_6'], _custom_event_object['_7'],
			false, 0, null
		);

		_document.dispatchEvent(_e);
	};


		//	set custom events
		$R.customEvents = {
			'names_to_keys': __custom_events__names_to_keys,
			'keys_to_names': __custom_events__keys_to_names,
			'names_to_objects': __custom_events__names_to_objects,
			'get_key': __custom_events__get_key,
			'dispatch':  __custom_events__dispatch
		};
	})();

	//	listen for events -- on click
	$R.document.addEventListener('click', function(_event)
	{
		var
			_event_key = $R.customEvents.get_key(_event),
			_event_name = $R.customEvents.keys_to_names[_event_key],
			_stop = false
		;

        //  __escapeForHTML

    //  escapeForHTML
    //  =============
        function __escapeForHTML(_string)
        {
            var _replace = {
                "&": "amp",
                '"': "quot",
                "<": "lt",
                ">": "gt"
            };

            return _string.replace(
                /[&"<>]/g,
                function (_match) { return ("&" + _replace[_match] + ";"); }
            );
        }


        //  which event?
		switch (_event_name)
		{
			case 'to-browser--evernote-login-show':

				//	clear login
				$('#evernote_login__container').removeClass('showSpinner showUsernameError showPasswordError');

				//	clear fields
				$('#evernote_login__username').val('');
				$('#evernote_login__username').blur();
				$('#evernote_login__password').val('');
				$('#evernote_login__password').blur();

				// show login
				$R.showDialog('clip__login');

				//	end
				_stop = true;
				break;


			case 'to-browser--evernote-login-failed':

				//	set error
				$('#evernote_login__password__error').html(__escapeForHTML($R.translate('evernote_login__general__error')));

				//	show error
				$('#evernote_login__container').removeClass('showSpinner').addClass('showPasswordError');

				//	end
				_stop = true;
				break;


			case 'to-browser--evernote-login-failed--username':

				//	set error
				$('#evernote_login__username__error').html(__escapeForHTML($R.translate('evernote_login__username__error__invalid')));

				//	show error
				$('#evernote_login__container').removeClass('showSpinner').addClass('showUsernameError');

				//	end
				_stop = true;
				break;


			case 'to-browser--evernote-login-failed--password':

				//	set error
				$('#evernote_login__password__error').html(__escapeForHTML($R.translate('evernote_login__password__error__invalid')));

				//	show error
				$('#evernote_login__container').removeClass('showSpinner').addClass('showPasswordError');

				//	end
				_stop = true;
				break;


			case 'to-browser--evernote-login-successful':

				//	waiting
				$R.showDialog('clip__doing');

				//	event
				$R.customEvents.dispatch(
					$R.customEvents.names_to_objects['to-extension--evernote-clip'],
					$R.document,
					$R.win
				);

				//	end
				_stop = true;
				break;


			case 'to-browser--evernote-clip-successful':

				//	notify
				window.setTimeout(function ()
				{
					$('#dialog__clip__doing').fadeOut(500,
						function () {
							$R.$sidebar.addClass('clipDone');
						}
					);
				}, 1000);

				//	end
				_stop = true;
				break;

			case 'to-browser--evernote-clip-failed':

				//	waiting
				$R.showDialog('clip__failed');

				//	end
				_stop = true;
				break;
		}

		if (_stop)
		{
			_event.stopPropagation();
			_event.preventDefault();
		}

	}, true);


		//	misc ux
		//	=======

	//	good ux
	//	=======
		$R.$fitts.click(function(){ $R.hide(); return false; });
		$R.$background.dblclick(function(){ $R.hide(); return false; });


	//	Keys, on Readable window（一系列的键盘动作）
	//	========================
		$(window).keydown(function (_event)
		{
			//	Readable visible?
			if ($R.visible); else { return; }

			//	include key combo detection

	/*
		_event must be defined
		_key_combo and _key_code will be defined at end of code
	*/

	var _key_code = 'NONE';
	switch (true)
	{
		case (_event.keyCode && (_event.keyCode >= 65 && _event.keyCode <= 90)):
			_key_code = String.fromCharCode(_event.keyCode).toUpperCase();
			break;

		case (_event.keyCode == 27):	_key_code = 'Escape';		break;
		case (_event.keyCode == 37):	_key_code = 'Left Arrow';	break;
		case (_event.keyCode == 39):	_key_code = 'Right Arrow';	break;
		case (_event.keyCode == 38):	_key_code = 'Up Arrow';		break;
		case (_event.keyCode == 40):	_key_code = 'Down Arrow';	break;
	}

	//	get
	//	===
		var _modifierKeys = (_event.originalEvent ? _event.originalEvent : _event);
		//	jQuery screws up -- fucks up the metaKey property badly

		var _key_combo = ''
			+ (_modifierKeys.ctrlKey ? 'Control + ' : '')
			+ (_modifierKeys.shiftKey ? 'Shift + ' : '')
			+ (_modifierKeys.altKey ? 'Alt + ' : '')
			+ (_modifierKeys.metaKey ? 'Command + ' : '')
			+ _key_code
		;

	//	needs a modifier -- if not just Escape key
	//	================
		if ((_key_code != 'Escape') && (_key_code == _key_combo))
		{
			_key_code = 'NONE';
			_key_combo = 'NONE';
		}


			//	stop
			var _stop = false;

			//	which?
			switch (true)
			{
				//	print
				case (_key_combo == 'Control + P' || _key_combo == 'Command + P'):
					window.print();
					_stop = true;
					break;

				//	hide
				case (_key_combo == 'Escape'):
				case ($R.vars && (_key_combo == $R.vars['keys_activation'])):
				case (_key_combo == 'Control + Alt + Left Arrow'):
				case (_key_combo == 'Control + Command + Left Arrow'):
					$R.hide();
					_stop = true;
					break;

				//	clip
				case ($R.vars && (_key_combo == $R.vars['keys_clip'])):
					$R.menu_functions['clip_to_evernote'].call();
					_stop = true;
					break;
			}

			//	stop
			if (_stop)
			{
				_event.preventDefault();
				_event.stopPropagation();
			}
		});


	//	scroll-back
	//	===========
		$R.scrollPosition = 0;
		$R.goToNamedAnchor = function (_anchor)
		{
			var _$e = $("[id='"+_anchor+"'], [name='"+_anchor+"']");
			if (_$e.length > 0); else { return; }

			$R.scrollPosition = $(window).scrollTop();
			$('#bottom_scroll_back').show();

			$(window).scrollTop(_$e.offset().top);
		};


		//	rtl
		//	===

	//	var
	//	===
		$R.rtl = false;


	//	functions
	//	=========
		$R.makeRTL = function ()
		{
			$('#curtain__rtl__radio__rtl').get(0).checked = true;
			$('#curtain__rtl__radio__ltr').get(0).checked = false;


			$R.rtl = true;

            $('html')
				.attr('dir', 'rtl')
				.addClass('couldBeRTL')
				.addClass('rtl');

            $R.$pages
                .attr('dir', 'rtl')
                .addClass('rtl');
		};

		$R.makeNotRTL = function ()
		{
			$('#curtain__rtl__radio__rtl').get(0).checked = false;
			$('#curtain__rtl__radio__ltr').get(0).checked = true;


			$R.rtl = false;

            $('html')
				.attr('dir', '')
				.removeClass('rtl');

            $R.$pages
                .attr('dir', '')
                .removeClass('rtl');
		};


	//	detect
	//	======
		(function ()
		{
			//	definitely rtl
			$R.$document.find('html, body').each(function (_i, _e)
			{
				switch (true) {
					case ($(_e).attr('dir') == 'rtl'):
					case ($(_e).css('direction') == 'rtl'):

					case ($(_e).attr('lang') == 'he'):
					case ($(_e).attr('lang') == 'he-il'):
					case ($(_e).attr('lang') == 'ar'):
					case ($(_e).attr('lang') == 'ur'):

						$R.makeRTL();
						return false;
				}
			});

			//	maybe rtl
			if ((!$R.rtl) && $R.$document.find("div[dir='rtl'], table[dir='rtl'], td[dir='rtl']").length > 0)
				{ $('html').addClass('couldBeRTL'); }
		})();


	//	events
	//	======
		$('#curtain__rtl__radio__rtl').change(function(){ $R.makeRTL(); return false; });
		$('#curtain__rtl__radio__ltr').change(function(){ $R.makeNotRTL(); return false; });


		//	measure text
		//	============

	//	asian languages
	//	===============
	//	http://msdn.microsoft.com/en-us/goglobal/bb688158
	//	http://en.wikipedia.org/wiki/Japanese_punctuation
	//	http://en.wikipedia.org/wiki/Japanese_typographic_symbols
	//	http://unicode.org/charts/PDF/U3000.pdf
	//	CJK: Chnese, Japanese, Korean -- HAN character set

	//	length //获得文本长度
	//	======
		$R.measureText__getTextLength = function (_the_text)
		{
			var _text = _the_text;

				_text = _text.replace(/[\s\n\r]+/gi, '');
				//_text = _text.replace(/\d+/, '');

			return _text.length;
		};


	//	word count（统计单词数）
	//	==========
		$R.measureText__getWordCount = function (_the_text)
		{
			var _text = _the_text;

			//	do stuff
			//	========

				_text = _text.replace(/[\s\n\r]+/gi, ' ');

				_text = _text.replace(/([.,?!:;()\[\]'""-])/gi, ' $1 ');

				_text = _text.replace(/([\u3000])/gi, 				'[=words(1)]');
				_text = _text.replace(/([\u3001])/gi, 				'[=words(2)]');
				_text = _text.replace(/([\u3002])/gi, 				'[=words(4)]');
				_text = _text.replace(/([\u301C])/gi, 				'[=words(2)]');
				_text = _text.replace(/([\u2026|\u2025])/gi, 		'[=words(2)]');
				_text = _text.replace(/([\u30FB\uFF65])/gi, 		'[=words(1)]');
				_text = _text.replace(/([\u300C\u300D])/gi, 		'[=words(1)]');
				_text = _text.replace(/([\u300E\u300F])/gi,			'[=words(1)]');
				_text = _text.replace(/([\u3014\u3015])/gi,			'[=words(1)]');
				_text = _text.replace(/([\u3008\u3009])/gi,			'[=words(1)]');
				_text = _text.replace(/([\u300A\u300B])/gi, 		'[=words(1)]');
				_text = _text.replace(/([\u3010\u3011])/gi, 		'[=words(1)]');
				_text = _text.replace(/([\u3016\u3017])/gi, 		'[=words(1)]');
				_text = _text.replace(/([\u3018\u3019])/gi, 		'[=words(1)]');
				_text = _text.replace(/([\u301A\u301B])/gi, 		'[=words(1)]');
				_text = _text.replace(/([\u301D\u301E\u301F])/gi, 	'[=words(1)]');
				_text = _text.replace(/([\u30A0])/gi, 				'[=words(1)]');


			//	count
			//	=====

				var
					_count = 0,
					_words_match = _text.match(/([^\s\d]{3,})/gi)
				;

				//	add match
				_count += (_words_match != null ? _words_match.length : 0);

				//	add manual count
				_text.replace(/\[=words\((\d)\)\]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); });

				//$R.log(_count);

			//	return
			//	======
				return _count;
		};


		//	content
		//	=======

	$R.footnotedLinksCount = 0;

	$R.getContent = function () // 得到内容
	{
		//	homepage?（这是主页？）
		if ($R.win.location.href == ($R.win.location.protocol + '//' + $R.win.location.host + '/'))
			{ $('html').addClass('showTips'); }

		//	selection or whole
		switch (true)
		{
			case ($R.getContent__manualSelection()):    //  提取手动选择的内容（可以忽略了）
			case ($R.getContent__find()):              //   内容发现
				break;

			default:
				break;
		}
        alert($R.getContent__find());

		//	debug
		$R.printDebugOutput();

		//	show content
		$R.showContent();
	};


	//	options（解析选项）
	//	=======
		$R.parsingOptions =
		{
			'_elements_ignore': 			'|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|',      //这些元素被忽略
			'_elements_ignore_tag': 		'|form|fieldset|details|dir|--|center|font|span|',  //这些标签忽略
			'_elements_self_closing': 		'|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|',
			'_elements_visible': 			'|article|section|--|ul|ol|li|dd|--|table|tr|td|--|div|--|p|--|h1|h2|h3|h4|h5|h6|--|span|', //显现这些元素
			'_elements_too_much_content': 	'|b|i|em|strong|--|h1|h2|h3|h4|h5|--|td|',              // 这里有多太重要内容
			'_elements_container': 			'|body|--|article|section|--|div|--|td|--|li|--|dd|dt|',        //这些容器是装内容的
			'_elements_link_density':		'|div|--|table|ul|ol|--|section|aside|header|',     // ？元素连结密度
			'_elements_floating':			'|div|--|table|',   //？ 元素浮动
			'_elements_above_target':		'|br|--|ul|ol|dl|',//?上述目标元素
			'_elements_keep_attributes':                        // 介些属性保留
			{
				'a': 		['href', 'title', 'name'],
				'img': 		['src', 'width', 'height', 'alt', 'title'],

				'video': 	['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'],
				'audio': 	['src', 'preload', 'autoplay', 'loop', 'controls'],
				'source': 	['src', 'type'],

				'object': 	['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'],
				'param': 	['name', 'value'],
				'embed': 	['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'],

				'iframe':	['src', 'width', 'height', 'frameborder', 'scrolling'],

				'td':		['colspan', 'rowspan'],
				'th':		['colspan', 'rowspan']
			}
		};


	//	next page keywords -- (?? charCodeAt() > 127)
	//	==================
		$R.nextPage__captionKeywords =
		[
			/* english */
			'next page', 'next',

			/* german */
			'vorw&#228;rts', 'weiter',

			/* japanese */
			'&#27425;&#12408;'
		];

		$R.nextPage__captionKeywords__not =
		[
			/* english */
			'article', 'story', 'post', 'comment', 'section', 'chapter'

		];


	//	skip links（要跳过的链接）
	//	==========
		$R.skipStuffFromDomains__links =
		[
			'doubleclick.net',
            'fastclick.net',
			'adbrite.com',
			'adbureau.net',
			'admob.com',
			'bannersxchange.com',
			'buysellads.com',
			'impact-ad.jp',
			'atdmt.com',
			'advertising.com',
			'itmedia.jp',
			'microad.jp',
			'serving-sys.com',
            'adplan-ds.com'
		];


	//	skip images（要跳过的图像）
	//	===========
		$R.skipStuffFromDomain__images =
		[
			'googlesyndication.com',
            'fastclick.net',
			'.2mdn.net',
			'de17a.com',
			'content.aimatch.com',
			'bannersxchange.com',
			'buysellads.com',
			'impact-ad.jp',
			'atdmt.com',
			'advertising.com',
			'itmedia.jp',
			'microad.jp',
			'serving-sys.com',
            'adplan-ds.com'
		];


	//	keep video（要跳过的视频）
	//	==========

		$R.keepStuffFromDomain__video =
		[
			'youtube.com',
			'youtube-nocookie.com',

			'vimeo.com',
			'hulu.com',
			'yahoo.com',
			'flickr.com',
			'newsnetz.ch'
		];


    /**
     * 检测一个节点，返回这个信息包含的信息。。应该会被反复调用。
     * @param _nodeToExplore    object HTMLBodyElement
     * @param _justExploring
     */
	$R.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring)
	{
		var
			_global__element_index = 0,                 // 节点索引

			_global__inside_link = false,               // 内部链接？
			_global__inside_link__element_index = 0,    // 内部链接节点索引

			_global__length__above_plain_text = 0,      // 纯文本长度
			_global__count__above_plain_words = 0,      // 有多少纯文本
			_global__length__above_links_text = 0,      // 链接文本长度
			_global__count__above_links_words = 0,      // 有多少链接纯文本
            _global__count__above_candidates = 0,       // 候选节点的计数
            _global__count__above_containers = 0,       // 容器的记数
			_global__above__plain_text = '',            // 纯文本
			_global__above__links_text = '',            // 链接文本

			_return__containers = [],                   // 容器
			_return__candidates = [],                   // 候选节点
			_return__links = []                         // 链接
		;

		//	actually do it
		//	==============


        //	recursive function（递归函数）
        //	==================
        var _recursive = function (_node)
        {
            //	increment index（增量索引）
            //	starts with 1
            _global__element_index++;

            var
                _tag_name = (_node.nodeType === 3 ?
                    '#text' : ((_node.nodeType === 1 && _node.tagName && _node.tagName > '')
                        ? _node.tagName.toLowerCase() : '#invalid')),//判断节点的类型
                _result =
                {
                    '__index': _global__element_index, // 0
                    '__node': _node,                   // 参数1


                    '_is__container': 		($R.parsingOptions._elements_container.indexOf('|'+_tag_name+'|') > -1),    //是内容容器嘛？
                    '_is__candidate': 		false,      //是候选滴？
                    '_is__text': 			false,      //是文本？
                    '_is__link': 			false,      //是链接？
                    '_is__link_skip': 		false,      //跳过链接？
                    '_is__image_small': 	false,      //是小图像？
                    '_is__image_medium': 	false,      //是中等图像？
                    '_is__image_large': 	false,      //是大图像
                    '_is__image_skip': 		false,      //大图像

                    '_debug__above__plain_text': _global__above__plain_text,    //纯文本？
                    '_debug__above__links_text': _global__above__links_text,    //链接文本？


                    '_length__above_plain_text': _global__length__above_plain_text, //纯文本长度
                    '_count__above_plain_words': _global__count__above_plain_words, //纯文本统计

                    '_length__above_links_text': _global__length__above_links_text,
                    '_count__above_links_words': _global__count__above_links_words,

                    '_length__above_all_text': 	(_global__length__above_plain_text + _global__length__above_links_text),
                    '_count__above_all_words': 	(_global__count__above_plain_words + _global__count__above_links_words),

                    '_count__above_candidates': _global__count__above_candidates,
                    '_count__above_containers': _global__count__above_containers,

                    '_length__plain_text': 0,
                    '_count__plain_words': 0,

                    '_length__links_text': 0,
                    '_count__links_words': 0,

                    '_length__all_text': 0,
                    '_count__all_words': 0,


                    '_count__containers': 0,
                    '_count__candidates': 0,

                    '_count__links': 0,
                    '_count__links_skip': 0,

                    '_count__images_small': 0,
                    '_count__images_medium': 0,
                    '_count__images_large': 0,
                    '_count__images_skip': 0
                };
            alert(_node.nodeType);
            alert(_tag_name);


            //	fast return（第一轮筛选）
            //	===========
            switch (true)
            {
                case ((_tag_name == '#invalid')):
                case (($R.parsingOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
                    return;     //被忽略了

                case (($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):   //显现吧，少年

                    //	included inline（包括行内）
                    //	_node must be defined（节点必须定义）
                    //	will return, if node is hidden（如果是隐藏节点就返回）

                    switch (true)
                    {
                        case (_node.offsetWidth > 0):   //如果宽度大于0
                        case (_node.offsetHeight > 0):  //如果高度宽度大于0
                            break;

                        default:
                            switch (true)
                            {
                                case (_node.offsetLeft > 0):    //左偏移量大于0
                                case (_node.offsetTop > 0):     //上偏移量大于0
                                    break;

                                default:
                                    return;
                            }
                            break;
                    }

                    break;

                //	self-closing -- with some exceptions
                case ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1):
                    switch (true)
                    {
                        case ((_tag_name == 'img')): break;
                        default: return;
                    }
                    break;
            }


            //	do stuff（经过第一波，来到第二波）
            //	========
            switch (true)
            {
                //	text node（文本节点）
                //	=========
                case ((_tag_name == '#text')):
                    //	mark（如果是文字，马了）
                    _result._is__text = true;

                    //	get（获得文字）
                    var _nodeText = _node.nodeValue;

                    //	result
                    _result._length__plain_text = $R.measureText__getTextLength(_nodeText); //获得文本长度
                    _result._count__plain_words = $R.measureText__getWordCount(_nodeText);  //获得文本单词数

                    if (_global__inside_link)
                    {
                        _global__length__above_links_text += _result._length__plain_text;
                        _global__count__above_links_words += _result._count__plain_words;
                        if (false && $R.debug) { _global__above__links_text += ' ' + _nodeText; }
                    }
                    else
                    {
                        _global__length__above_plain_text += _result._length__plain_text;
                        _global__count__above_plain_words += _result._count__plain_words;
                        if (false && $R.debug) { _global__above__plain_text += ' ' + _nodeText; }
                    }

                    //	return text（返回文本）
                    return _result;


                //	link
                //	====
                case (_tag_name == 'a'):
                    var _href = _node.href;

                    //	sanity
                    if (_href > ''); else { break; }        //如果是空链接就退出
                    if (_href.indexOf); else { break; }

                    _result._is__link = true;               //介是链接

                    //	skip
                    for (var i=0, _i=$R.skipStuffFromDomains__links.length; i<_i; i++)
                    {
                        if (_node.href.indexOf($R.skipStuffFromDomains__links[i]) > -1)
                        { _result._is__link_skip = true; break; }       //都是跳过的链接
                    }

                    //	inside link
                    if (_global__inside_link); else
                    {
                        _global__inside_link = true;
                        _global__inside_link__element_index = _result.__index;
                    }

                    //	done
                    _return__links.push(_result);
                    break;


                //	image
                //	=====
                case (_tag_name == 'img'):

                    //	skip
                    //	====
                    if (_node.src && _node.src.indexOf)
                    {
                        for (var i=0, _i=$R.skipStuffFromDomain__images.length; i<_i; i++)
                        {
                            if (_node.src.indexOf($R.skipStuffFromDomain__images[i]) > -1)
                            { _result._is__image_skip = true; break; }
                        }
                    }

                    //	size
                    //	====
                    var	_width = $(_node).width(), _height = $(_node).height();
                    switch (true)
                    {
                        case ((_width * _height) >= 50000):
                        case ((_width >= 350) && _height >= 75):
                            _result._is__image_large = true;    //胀胀的，好大的图片啊
                            break;

                        case ((_width * _height) >= 20000):
                        case ((_width >= 150) && (_height >= 150)):
                            _result._is__image_medium = true;
                            break;

                        case ((_width <= 5) && (_height <= 5)):
                            _result._is__image_skip = true;
                            break;

                        default:
                            _result._is__image_small = true;
                            break;
                    }

                    break;
            }


            //	child nodes
            //	===========
            for (var i=0, _i=_node.childNodes.length; i<_i; i++)
            {
                var
                    _child = _node.childNodes[i],
                    _child_result = _recursive(_child)
                    ;

                //	if false, continue
                //	==================
                if (_child_result); else { continue; }


                //	add to result（一些数据统计）
                //	=============
                _result._count__links += 			_child_result._count__links + 			(_child_result._is__link ? 1 : 0);
                _result._count__links_skip += 		_child_result._count__links_skip + 		(_child_result._is__link_skip ? 1 : 0);

                _result._count__images_small += 	_child_result._count__images_small + 	(_child_result._is__image_small ? 1 : 0);
                _result._count__images_medium += 	_child_result._count__images_medium + 	(_child_result._is__image_medium ? 1 : 0);
                _result._count__images_large += 	_child_result._count__images_large + 	(_child_result._is__image_large ? 1 : 0);
                _result._count__images_skip += 		_child_result._count__images_skip + 	(_child_result._is__image_skip ? 1 : 0);

                _result._count__containers += 		_child_result._count__containers + 		(_child_result._is__container ? 1 : 0);
                _result._count__candidates += 		_child_result._count__candidates + 		(_child_result._is__candidate ? 1 : 0);

                _result._length__all_text += 		_child_result._length__plain_text + 	_child_result._length__links_text;
                _result._count__all_words += 		_child_result._count__plain_words + 	_child_result._count__links_words;

                //	plain text / link text
                //	======================
                switch (true)
                {
                    case (_child_result._is__link):
                        //	no text to add
                        _result._length__links_text += (_child_result._length__plain_text + _child_result._length__links_text);
                        _result._count__links_words += (_child_result._count__plain_words + _child_result._count__links_words);
                        break;

                    default:
                        _result._length__plain_text += 			_child_result._length__plain_text;
                        _result._count__plain_words += 			_child_result._count__plain_words;
                        _result._length__links_text += 			_child_result._length__links_text;
                        _result._count__links_words += 			_child_result._count__links_words;
                        break;
                }
            }


            //	after child nodes
            //	=================

            //	mark as not in link anymore
            //	===========================
            if (true
                && (_result._is__link)
                && (_global__inside_link__element_index == _result.__index)
                ) {
                _global__inside_link = false;
                _global__inside_link__element_index = 0;
            }


            //	add to containers
            //	=================
            if (_result._is__container || ((_result.__index == 1) && (_justExploring == true)))
            {
                //	add to containers
                _return__containers.push(_result);

                //  increase above containers
                if (_result._is__container) { _global__count__above_containers++; }

                //	add to candidates
                if (_justExploring); else
                {
                    switch (true)
                    {
                        case (($R.language != 'cjk') && ((_result._count__links * 2) >= _result._count__plain_words)):  /* link ratio */

                        case (($R.language != 'cjk') && (_result._length__plain_text < (65 / 3))):  /* text length */
                        case (($R.language != 'cjk') && (_result._count__plain_words < 5)):			/* words */

                        case (($R.language == 'cjk') && (_result._length__plain_text < 10)):	    /* text length */
                        case (($R.language == 'cjk') && (_result._count__plain_words < 2)):			/* words */


                            //case (_result._length__plain_text == 0):    /* no text */
                            //case (_result._count__plain_words == 0):    /* no words */

                            //case (($R.language == 'cjk') && ((_result._length__plain_text / 65 / 3) < 0.1)):				/* paragrahs of 3 lines */
                            //case (($R.language != 'cjk') && ((_result._count__plain_words / 50) < 0.5)):					/* paragraphs of 50 words */

                            //	not a valid candidate
                            //if (_tag_name == 'div') { $R.log('bad candidate', _result.__node); }

                            break;

                        default:
                            //	good candidate
                            _result._is__candidate = true;
                            _return__candidates.push(_result);

                            //  increase above candidates
                            _global__count__above_candidates++;

                            break;
                    }

                    //	special case for body -- if it was just skipped
                    //	=====================
                    if ((_result.__index == 1) && !(_result._is__candidate))
                    {
                        _result._is__candidate = true;
                        _result._is__bad = true;
                        _return__candidates.push(_result);
                    }
                }
            }


            //	return
            //	======
            return _result;
        };
        _recursive(_nodeToExplore);

		//	just exploring -- return first thing
		//	==============
			if (_justExploring) { return _return__containers.pop(); }
		//	return containers list
		//	======================

        return {
            '_containers': 	_return__containers,    //容器
            '_candidates': 	_return__candidates,    //候选人
            '_links': 		_return__links
        };
	};


	//获得内容
	$R.getContent__processCandidates = function (_candidatesToProcess)
	{
		//	process this var
		//	================
			var _candidates = _candidatesToProcess;

		//	sort _candidates -- the lower in the dom, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__index < b.__index): return -1;
					case (a.__index > b.__index): return 1;
					default: return 0;
				}
			});


		//	get first
		//	=========
			var	_main = _candidates[0]
			if ($R.debug) { $R.log('should be body', _main, _main.__node); }

		//	pieces of text(件的文本)
		//	and points computation(和点的计算)
		//	======================
			for (var i=0, _i=_candidates.length; i<_i; i++)
			{
				//	pieces
				//	======
					var
						_count__pieces = 0,
						_array__pieces = []
					;

					for (var k=i, _k=_candidates.length; k<_k; k++)
					{
						if (_candidates[k]._count__candidates > 0) { continue; }
						if ($.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; }

						//	store piece, if in debug mode
						if ($R.debug) { _array__pieces.push(_candidates[k]); }

						//	incement pieces count
						_count__pieces++;
					}


				//	candidate details
				//	=================
					_candidates[i]['__candidate_details'] = $R.getContent__computeDetailsForCandidate(_candidates[i], _main);//断点1


				//	pieces -- do this here because _main doesn't yet have a pieces count
				//	======

					//	set pieces
					_candidates[i]['_count__pieces'] = _count__pieces;
					_candidates[i]['_array__pieces'] = _array__pieces;

					//	pieces ratio
					_candidates[i]['__candidate_details']['_ratio__count__pieces_to_total_pieces'] = (_count__pieces / (_candidates[0]._count__pieces + 1));


                //  check some more
                //  ===============
                /*    switch (true)
                    {
                        case (($R.language != 'cjk') && (_candidates[i]['__candidate_details']['_ratio__length__links_text_to_plain_text'] > 1)):
                        case (($R.language != 'cjk') && (_candidates[i]['__candidate_details']['_ratio__count__links_words_to_plain_words'] > 1)):
                            _candidates[i]._is__bad = true;
                            break;
                    }*/


				//	points
				//	======
					_candidates[i].__points_history = $R.getContent__computePointsForCandidate(_candidates[i], _main);
					_candidates[i].__points = _candidates[i].__points_history[0];
			}


		//	sort _candidates -- the more points, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__points > b.__points): return -1;
					case (a.__points < b.__points): return 1;
					default: return 0;
				}
			});

		//	return
		//	======
			return _candidates;
	};

//   候选节点计算详情
	$R.getContent__computeDetailsForCandidate = function (_e, _main)
	{
		var _r = {};


		//	bad candidate
		//	=============
			if (_e._is__bad) { return _r; }


		//	paragraphs段落
		//	==========
			_r['_count__lines_of_65_characters'] = (_e._length__plain_text / 65); // 统计每行65个字符
			_r['_count__paragraphs_of_3_lines'] =  (_r._count__lines_of_65_characters / 3); // 3行为一段
			_r['_count__paragraphs_of_5_lines'] =  (_r._count__lines_of_65_characters / 5); // 5行

			_r['_count__paragraphs_of_50_words'] = (_e._count__plain_words / 50);
			_r['_count__paragraphs_of_80_words'] = (_e._count__plain_words / 80);


		//	total text总文本
		//	==========
			_r['_ratio__length__plain_text_to_total_plain_text'] =  (_e._length__plain_text / _main._length__plain_text);   // 总纯文本长
			_r['_ratio__count__plain_words_to_total_plain_words'] = (_e._count__plain_words / _main._count__plain_words);


		//	links 链接
		//	=====
			_r['_ratio__length__links_text_to_plain_text'] =  (_e._length__links_text / _e._length__plain_text);
			_r['_ratio__count__links_words_to_plain_words'] = (_e._count__links_words / _e._count__plain_words);

			_r['_ratio__length__links_text_to_all_text'] =  (_e._length__links_text / _e._length__all_text);
			_r['_ratio__count__links_words_to_all_words'] = (_e._count__links_words / _e._count__all_words);

			_r['_ratio__length__links_text_to_total_links_text'] =  (_e._length__links_text / (_main._length__links_text + 1));
			_r['_ratio__count__links_words_to_total_links_words'] = (_e._count__links_words / (_main._count__links_words + 1));

			_r['_ratio__count__links_to_total_links'] = (_e._count__links / (_main._count__links + 1));
			_r['_ratio__count__links_to_plain_words'] = ((_e._count__links * 2) / _e._count__plain_words);


		//	text above
		//	==========
            var
                _divide__candidates = Math.max(2, Math.ceil(_e._count__above_candidates * 0.5)),

                _above_text = ((0
                    + (_e._length__above_plain_text * 1)
                    + (_e._length__above_plain_text / _divide__candidates)
                ) / 2),

                _above_words = ((0
                    + (_e._count__above_plain_words * 1)
                    + (_e._count__above_plain_words / _divide__candidates)
                ) / 2)
            ;

			_r['_ratio__length__above_plain_text_to_total_plain_text'] =  (_above_text / _main._length__plain_text);
			_r['_ratio__count__above_plain_words_to_total_plain_words'] = (_above_words / _main._count__plain_words);


		//	candidates
		//	==========
			_r['_ratio__count__candidates_to_total_candidates'] = (_e._count__candidates / (_main._count__candidates + 1));
			_r['_ratio__count__containers_to_total_containers'] = (_e._count__containers / (_main._count__containers + 1));


		//	return
		//	======
			return _r;
	};


	$R.getContent__computePointsForCandidate = function (_e, _main)
	{
		var
			_details = _e.__candidate_details,
			_points_history = [],
            _really_big = ((_main._length__plain_text / 65) > 250)
		;

		//	bad candidate坏候选人
		if (_e._is__bad) { return [0]; }


		//	the basics
		//	==========
			_points_history.unshift(((0
				+ (_details._count__paragraphs_of_3_lines)
				+ (_details._count__paragraphs_of_5_lines * 1.5)
				+ (_details._count__paragraphs_of_50_words)
				+ (_details._count__paragraphs_of_80_words * 1.5)
				+ (_e._count__images_large * 3)
				- ((_e._count__images_skip + _e._count__images_small) * 0.5)
			) * 1000));

            //  negative
            if (_points_history[0] < 0) { return [0]; }


        //  candidates and containers
        //  =========================
            var
                _divide__pieces =     Math.max(5,  Math.ceil(_e._count__pieces *     0.25)),
                _divide__candidates = Math.max(5,  Math.ceil(_e._count__candidates * 0.25)),
                _divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25))
            ;

            _points_history.unshift(((0
                + (_points_history[0] * 3)
                + (_points_history[0] / _divide__pieces)
                + (_points_history[0] / _divide__candidates)
                + (_points_history[0] / _divide__containers)
            ) / 6));


		//	total text
		//	==========
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);

            if (_really_big) {
            $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);
            }


		//	text above
		//	==========
			$R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);

            if (_really_big) {
            $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);
            }


		//	links outer
		//	===========
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__length__links_text_to_total_links_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_words_to_total_links_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_to_total_links), _points_history);


        //  links inner
        //  ===========
            var __lr = ($R.language == 'cjk' ? 0.75 : 0.50);

            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);

            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);

            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);


		//	candidates, pieces
		//	==================
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);


		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
	};


    /* 获得内容第二波 */
	$R.getContent__processCandidatesSecond = function (_processedCandidates)
	{
		var
			_candidates = _processedCandidates,
			_main = _candidates[0]
		;

		//	only get children of target
		//	===========================
			_candidates = $.map(_candidates, function (_element, _index)
			{
				switch (true)
				{
					case (!(_index > 0)):
					case (!($.contains(_main.__node, _element.__node))):
						return null;

					default:
						return _element;
				}
			});

            //  add main - to amke sure the result is never blank
            _candidates.unshift(_main);


		//	sort _candidates -- the lower in the dom, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__index < b.__index): return -1;
					case (a.__index > b.__index): return 1;
					default: return 0;
				}
			});


		//	second candidate computation
		//	============================
			for (var i=0, _i=_candidates.length; i<_i; i++)
			{
				//	additional numbers
				//	==================
					_candidates[i].__second_length__above_plain_text = (_candidates[i]._length__above_plain_text - _main._length__above_plain_text);
					_candidates[i].__second_count__above_plain_words = (_candidates[i]._count__above_plain_words - _main._count__above_plain_words);

				//	candidate details
				//	=================
					_candidates[i]['__candidate_details_second'] = $R.getContent__computeDetailsForCandidateSecond(_candidates[i], _main);

				//	check some more
				//	===============
				/*	switch (true)
					{
                        case (!(_candidates[i]['__candidate_details_second']['_ratio__count__plain_words_to_total_plain_words'] > 0.05)):
						case (!(_candidates[i]['__candidate_details_second']['_ratio__length__plain_text_to_total_plain_text'] > 0.05)):

						//case (!(_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_total_plain_words'] < 0.1)):
						//case (!(_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_total_plain_text'] < 0.1)):

                        //case (_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_plain_text'] > 1):
                        //case (_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_plain_words'] > 1):

                            _candidates[i]._is__bad = true;
							//	wil set points to 0, in points computation function
							break;
					}*/

				//	points
				//	======
					_candidates[i].__points_history_second = $R.getContent__computePointsForCandidateSecond(_candidates[i], _main);
					_candidates[i].__points_second = _candidates[i].__points_history_second[0];
			}


		//	sort _candidates -- the more points, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__points_second > b.__points_second): return -1;
					case (a.__points_second < b.__points_second): return 1;
					default: return 0;
				}
			});

		//	return
		//	======
			return _candidates;
	};


	$R.getContent__computeDetailsForCandidateSecond = function (_e, _main)
	{
		var _r = {};


		//	bad candidate
		//	=============
			if (_e._is__bad) { return _r; }


		//	total text
		//	==========
			_r['_ratio__length__plain_text_to_total_plain_text'] = 	(_e._length__plain_text / _main._length__plain_text);
			_r['_ratio__count__plain_words_to_total_plain_words'] = (_e._count__plain_words / _main._count__plain_words);


		//	links
		//	=====
			_r['_ratio__length__links_text_to_all_text'] =	(_e._length__links_text / _e._length__all_text);
			_r['_ratio__count__links_words_to_all_words'] = (_e._count__links_words / _e._count__all_words);

			_r['_ratio__length__links_text_to_total_links_text'] = 	(_e._length__links_text / (_main._length__links_text + 1));
			_r['_ratio__count__links_words_to_total_links_words'] = (_e._count__links_words / (_main._count__links_words + 1));

			_r['_ratio__count__links_to_total_links'] = (_e._count__links / (_main._count__links + 1));
			_r['_ratio__count__links_to_plain_words'] = ((_e._count__links * 2) / _e._count__plain_words);


		//	text above
		//	==========

            var
                _divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates - _main._count__above_candidates) * 0.5)),

                _above_text = ((0
                    + (_e.__second_length__above_plain_text * 1)
                    + (_e.__second_length__above_plain_text / _divide__candidates)
                ) / 2),

                _above_words = ((0
                    + (_e.__second_count__above_plain_words * 1)
                    + (_e.__second_count__above_plain_words / _divide__candidates)
                ) / 2)
            ;

			_r['_ratio__length__above_plain_text_to_total_plain_text'] =  (_above_text / _main._length__plain_text);
			_r['_ratio__count__above_plain_words_to_total_plain_words'] = (_above_words / _main._count__plain_words);

			_r['_ratio__length__above_plain_text_to_plain_text'] = 	(_above_text / _e._length__plain_text);
			_r['_ratio__count__above_plain_words_to_plain_words'] = (_above_words / _e._count__plain_words);


		//	candidates
		//	==========
			_r['_ratio__count__candidates_to_total_candidates'] = (Math.max(0, (_e._count__candidates - (_main._count__candidates * 0.25))) / (_main._count__candidates + 1));
			_r['_ratio__count__containers_to_total_containers'] = (Math.max(0, (_e._count__containers - (_main._count__containers * 0.25))) / (_main._count__containers + 1));
			_r['_ratio__count__pieces_to_total_pieces'] =         (Math.max(0, (_e._count__pieces - (_main._count__pieces * 0.25))) / (_main._count__pieces + 1));


		//	return
		//	======
			return _r;
	};


	$R.getContent__computePointsForCandidateSecond = function (_e, _main)
	{
		var
			_details = _e.__candidate_details,
			_details_second = _e.__candidate_details_second,
			_points_history = []
		;

		//	bad candidate
		if (_e._is__bad) { return [0]; }


		//	get initial points
		//	==================
			_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);


        //  candidates and containers
        //  =========================
            var
                _divide__pieces =     Math.max(5,  Math.ceil(_e._count__pieces *     0.25)),
                _divide__candidates = Math.max(5,  Math.ceil(_e._count__candidates * 0.25)),
                _divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25))
            ;

            _points_history.unshift(((0
                + (_points_history[0] * 3)
                + ((_points_history[0] / _divide__pieces) * 2)
                + ((_points_history[0] / _divide__candidates) * 2)
                + ((_points_history[0] / _divide__containers) * 2)
            ) / 9));


		//	total text
		//	==========
			$R.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
			$R.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);


		//	text above
		//	==========
            var __ar = ($R.language == 'cjk' ? 0.50 : 0.10);

			$R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);

			$R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);


		//	links outer
		//	===========
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_to_total_links), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__length__links_text_to_total_links_text), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_words_to_total_links_words), _points_history);


		//	links inner
		//	===========
            var __lr = ($R.language == 'cjk' ? 0.75 : 0.50);

			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);

			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__length__links_text_to_all_text), _points_history);
			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_words_to_all_words), _points_history);

			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_to_plain_words), _points_history);


		//	candidates, containers, pieces
		//	==============================
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__candidates_to_total_candidates), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__containers_to_total_containers), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__pieces_to_total_pieces), _points_history);


		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
	};



	$R.getContent__computePointsForCandidateThird = function (_e, _main)
	{
		var
			_details = _e.__candidate_details,
			_details_second = _e.__candidate_details_second,
			_points_history = []
		;

		//	bad candidate
		if (_e._is__bad) { return [0]; }


		//	get initial points
		//	==================
			_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);


        //  candidates and containers
        //  =========================
            var
                _divide__pieces =     Math.max(2, Math.ceil(_e._count__pieces *     0.25)),
                _divide__candidates = Math.max(2, Math.ceil(_e._count__candidates * 0.25)),
                _divide__containers = Math.max(4, Math.ceil(_e._count__containers * 0.25))
            ;

            _points_history.unshift(((0
                + (_points_history[0] * 3)
                + ((_points_history[0] / _divide__pieces) * 2)
                + ((_points_history[0] / _divide__candidates) * 2)
                + ((_points_history[0] / _divide__containers) * 2)
            ) / 9));


        //  total text
        //  ==========
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);


        //	text above
        //	==========
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);


        //	links inner
        //	===========
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);


        //	candidates, pieces
        //	==================
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);


		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
    };



    $R.getContent__computePointsForCandidate__do = function (_ratio_remaining, _power, _ratio, _points_history)
    {
        var
            _points_remaining = (_points_history[0] * _ratio_remaining),
            _points_to_compute = (_points_history[0] - _points_remaining)
        ;

        if (_ratio < 0)
        {
            //_points_return = (0.75 * _points_remaining);
            _points_return = _points_remaining;
        }
        else
        {
            _points_return = 0
                + _points_remaining
                + (_points_to_compute * Math.pow(_ratio, _power))
            ;
        }

        //	add
        _points_history.unshift(_points_return);
    };


    /**
     * 从节点里得到内容，得到HTML的一步
     * @param _nodeToBuildHTMLFor   object
     * @param _custom_mode          string
     */
	$R.getContent__buildHTMLForNode = function (_nodeToBuildHTMLFor, _custom_mode)
	{
		var
			_global__element_index = 0,
			_global__the_html = '',
			_global__exploreNodeToBuildHTMLFor = $R.getContent__exploreNodeAndGetStuff(_nodeToBuildHTMLFor, true)
		;   // 全局探索节点建立网页

		//	custom
		//	======
		switch (_custom_mode)
		{
			case 'above-the-target':
				_global__exploreNodeToBuildHTMLFor = false;
				break;
		}

		//	recursive function（递归得到内部内容）
		//	==================
		var _recursive = function (_node)
		{
			//	increment index -- starts with 1
			//	===============
				_global__element_index++;
			//	vars
			//	====
				var
					_explored = false,
					_tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 && _node.tagName && _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
					_pos__start__before = 0,
					_pos__start__after = 0,
					_pos__end__before = 0,
					_pos__end__after = 0
				;

			//	fast return
			//	===========
				switch (true)
				{
					case ((_tag_name == '#invalid')):
					case (($R.parsingOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
						return;

					case (_tag_name == '#text'):
						_global__the_html += _node.nodeValue
							.replace(/</gi, '&lt;')
							.replace(/>/gi, '&gt;')
						;
						return;
				}

			//	hidden
			//	======|article|section|--|ul|ol|li|dd|--|table|tr|td|--|div|--|p|--|h1|h2|h3|h4|h5|h6|--|span|
				if ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)    // 如果是这里面的内容
					{
	//	included inline
	//	_node must be defined
	//	will return, if node is hidden
    // 移除隐藏元素（高宽小于0，或者在移出了可视范围）
	switch (true)
	{
		case (_node.offsetWidth > 0):
		case (_node.offsetHeight > 0):
			break;

		default:
			switch (true)
			{
				case (_node.offsetLeft > 0):
				case (_node.offsetTop > 0):
					break;

				default:
					return;
			}
			break;
	}
 }

			//	clean -- before
			//	=====

	//	just a return will skip the whol element
	//	including children

	//	objects, embeds, iframes（分标签提取内容了）
	//	========================
		switch (_tag_name)
		{
			case ('object'):
			case ('embed'):
			case ('iframe'):
				var
					_src = (_tag_name == 'object' ? $(_node).find("param[name='movie']").attr('value') : $(_node).attr('src')),
					_skip = ((_src > '') ? false : true)
				;

				if (_skip); else
				{
					//	default skip
					_skip = true;

					//	loop
					for (var i=0, _i=$R.keepStuffFromDomain__video.length; i<_i; i++)
						{ if (_src.indexOf($R.keepStuffFromDomain__video[i]) > -1) { _skip = false; break; } }
				}

				//	skip?
				if (_skip)
					{ $R.debugOutline(_node, 'clean-before', 'object-embed-iframe'); return; }

				break;
		}

	//	skipped link（如果是A标记）
	//	============
		if (_tag_name == 'a')
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._is__link_skip):
				case (((_explored._count__images_small + _explored._count__images_skip) > 0) && (_explored._length__plain_text < 65)):
					$R.debugOutline(_node, 'clean-before', 'skip-link');
					return;
			}
		}

	//	link density
	//	============|div|--|table|ul|ol|--|section|aside|header|
		if ($R.parsingOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
                case (_explored._length__plain_text > (65 * 3 * 2)):
                case ($R.language == 'cjk' && (_explored._length__plain_text > (65 * 3 * 1))):
				case (!(_explored._count__links > 1)):
				case (_global__exploreNodeToBuildHTMLFor && (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.5):
				case (_global__exploreNodeToBuildHTMLFor && (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.5):
				case ((_explored._length__plain_text == 0) && (_explored._count__links == 1) && (_explored._length__links_text < 65)):
				case ((_explored._length__plain_text < 25) && ((_explored._count__images_large + _explored._count__images_medium) > 0)):
					break;

				case ((_explored._length__links_text / _explored._length__all_text) < 0.5):
					if (_explored._count__links > 0); else { break; }
					if (_explored._count__links_skip > 0); else { break; }
					if (((_explored._count__links_skip / _explored._count__links) > 0.25) && (_explored._length__links_text / _explored._length__all_text) < 0.05) { break; }

				default:
					$R.debugOutline(_node, 'clean-before', 'link-density');
					return;
			}
		}

	//	floating
	//	========|div|--|table|
		if ($R.parsingOptions._elements_floating.indexOf('|'+_tag_name+'|') > -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._length__plain_text > (65 * 3 * 2)):
                case ($R.language == 'cjk' && (_explored._length__plain_text > (65 * 3 * 1))):
				case (_global__exploreNodeToBuildHTMLFor && (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25):
				case (_global__exploreNodeToBuildHTMLFor && (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.25):
				case ((_explored._length__plain_text < 25) && (_explored._length__links_text < 25) && ((_explored._count__images_large + _explored._count__images_medium) > 0)):
					break;

				default:
					var _float = $(_node).css('float');
					if (_float == 'left' || _float == 'right'); else { break; }
					if ((_explored._length__links_text == 0) && ((_explored._count__images_large + _explored._count__images_medium) > 0)) { break; }

					$R.debugOutline(_node, 'clean-before', 'floating');
					return;
			}
		}

	//	above target
	//	============
		if (_custom_mode == 'above-the-target')
		{   //|br|--|ul|ol|dl|
			if ($R.parsingOptions._elements_above_target.indexOf('|'+_tag_name+'|') > -1)
				{ $R.debugOutline(_node, 'clean-before', 'above-target'); return; }

			if (_tag_name == 'img')
			{
				_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
				if (_explored._is__image_large); else
					{ $R.debugOutline(_node, 'clean-before', 'above-target'); return; }
			}
		}


			//	start tag
			//	=========|form|fieldset|details|dir|--|center|font|span|（如果不是这些标签）
				if ($R.parsingOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1); else
				{
					/* mark */	_pos__start__before = _global__the_html.length;
					/* add */	_global__the_html += '<'+_tag_name;

					//	attributes
					//	==========
                //	allowed attributes
                //	==================
                    if (_tag_name in $R.parsingOptions._elements_keep_attributes)
                    {
                        for (var i=0, _i=$R.parsingOptions._elements_keep_attributes[_tag_name].length; i<_i; i++)
                        {
                            var
                                _attribute_name = $R.parsingOptions._elements_keep_attributes[_tag_name][i],
                                _attribute_value = _node.getAttribute(_attribute_name)
                            ;

                            //	if present
                            if (_attribute_value > '')
                                { _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; }
                        }
                    }

	//	keep ID for all elements
	//	========================
		var _id_attribute = _node.getAttribute('id');
		if (_id_attribute > '')
			{ _global__the_html += ' id="'+_id_attribute+'"'; }

	//	links target NEW
	//	================
		if (_tag_name == 'a') { _global__the_html += ' target="_blank"'; }

        //	close start
        //	===========|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|
        if ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; }
        else { _global__the_html += '>'; }

            /* mark */ _pos__start__after = _global__the_html.length;
        }

        //	child nodes
        //	===========|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|
        if ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else
        // 不是那些可以闭合了的标签。
        {
            for (var i=0, _i=_node.childNodes.length; i<_i; i++)
                { _recursive(_node.childNodes[i]); }
        }

			//	end tag
			//	=======
				switch (true)
				{// |form|fieldset|details|dir|--|center|font|span|
					case (($R.parsingOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
						return;
//                  |br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|
					case (($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
						/* mark */ 	_pos__end__before = _global__the_html.length;
						/* mark */ 	_pos__end__after = _global__the_html.length;
						break;

					default:
						/* mark */ 	_pos__end__before = _global__the_html.length;
						/* end */ 	_global__the_html += '</'+_tag_name+'>';
						/* mark */ 	_pos__end__after = _global__the_html.length;
						break;
				}

			//	clean -- after
			//	=====

	//	we need to actually cut things out of
	//	"_global__the_html", for stuff to not be there


	//	largeObject classes
	//	===================
		if (_tag_name == 'iframe' || _tag_name == 'embed' || _tag_name == 'object')
		{
			_global__the_html = ''
				+ _global__the_html.substr(0, _pos__start__before)
				+ '<div class="readableLargeObjectContainer">'
				+ 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before))
				+ '</div>'
			;
			return;
		}

	//	add image classes
	//	=================
		if (_tag_name == 'img')
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._is__image_skip):
					$R.debugOutline(_node, 'clean-after', 'skip-img');
					_global__the_html = _global__the_html.substr(0, _pos__start__before);
					return;

				case (_explored._is__image_large):
					_global__the_html = ''
						+ _global__the_html.substr(0, _pos__start__before)
						+ '<div class="readableLargeImageContainer'
						+ 	(($(_node).width() <= 250) && ($(_node).height() >= 250) ? ' float' : '')
						+ '">'
						+ 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before))
						+ '</div>'
					;
					return;
			}
		}

	//	large images in links
	//	=====================
		if (_tag_name == 'a')
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._count__images_large == 1):
					_global__the_html = ''
						+ _global__the_html.substr(0, _pos__start__after-1)
						+ ' class="readableLinkWithLargeImage">'
						+ 	_global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
						+ '</a>'
					;
					return;

				case (_explored._count__images_medium == 1):
					_global__the_html = ''
						+ _global__the_html.substr(0, _pos__start__after-1)
						+ ' class="readableLinkWithMediumImage">'
						+ 	_global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
						+ '</a>'
					;
					return;
			}
		}

	//	too much content
	//	================|b|i|em|strong|--|h1|h2|h3|h4|h5|--|td|
		if ($R.parsingOptions._elements_too_much_content.indexOf('|'+_tag_name+'|') > -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_tag_name == 'h1' && (_explored._length__all_text > (65 * 2))):
				case (_tag_name == 'h2' && (_explored._length__all_text > (65 * 2 * 3))):
				case ((_tag_name.match(/^h(3|4|5|6)$/) != null) && (_explored._length__all_text > (65 * 2 * 5))):
				case ((_tag_name.match(/^(b|i|em|strong)$/) != null) && (_explored._length__all_text > (65 * 5 * 5))):
					$R.debugOutline(_node, 'clean-after', 'too-much-content');
					_global__the_html = ''
						+ _global__the_html.substr(0, _pos__start__before)
						+ _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
					;
					return;
			}
		}

	//	empty elements
	//	==============
		switch (true)
		{
			case (($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
			case (($R.parsingOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
			case (_tag_name == 'td'):
				break;

			default:
				var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after));
					_contents = _contents.replace(/(<br \/>)/gi, '');
					_contents = _contents.replace(/(<hr \/>)/gi, '');
				var _contentsLength = $R.measureText__getTextLength(_contents);

				switch (true)
				{
					case (_contentsLength == 0 && _tag_name == 'p'):
						_global__the_html = _global__the_html.substr(0, _pos__start__before) + '<br /><br />';
						return;

					case (_contentsLength == 0):
					case ((_contentsLength < 5) && ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
						$R.debugOutline(_node, 'clean-after', 'blank');
						_global__the_html = _global__the_html.substr(0, _pos__start__before);
						return;
				}
				break;
		}

	//	too much missing
	//	================
		if ($R.parsingOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			var
				_contents = _global__the_html
							.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
								.replace(/(<([^>]+)>)/gi, ''),
				_contentsLength = $R.measureText__getTextLength(_contents),
				_initialLength = 0
					+ _explored._length__all_text
					+ (_explored._count__images_small 					* 10)
					+ (_explored._count__images_skip 					* 10)
					+ (_node.getElementsByTagName('iframe').length 		* 10)
					+ (_node.getElementsByTagName('object').length 		* 10)
					+ (_node.getElementsByTagName('embed').length 		* 10)
					+ (_node.getElementsByTagName('button').length 		* 10)
					+ (_node.getElementsByTagName('input').length 		* 10)
					+ (_node.getElementsByTagName('select').length 		* 10)
					+ (_node.getElementsByTagName('textarea').length 	* 10)
			;

			//	too much missing
			switch (true)
			{
				case (!(_contentsLength > 0)):
				case (!(_initialLength > 0)):
				case (!((_contentsLength / _initialLength) < 0.5)):
				case (!(($R.language == 'cjk') && (_contentsLength / _initialLength) < 0.1)):
				case ((_global__exploreNodeToBuildHTMLFor && ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25))):
				case (($R.language == 'cjk') && (_global__exploreNodeToBuildHTMLFor && ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.1))):
					break;

				default:
					$R.debugOutline(_node, 'clean-after', 'missing-density');
					_global__the_html = _global__the_html.substr(0, _pos__start__before);
					return;
			}
		}


			//	return
				return;
		};

		//	actually do it
		_recursive(_nodeToBuildHTMLFor);
		//	return html
		return _global__the_html;
	};// 得到HTML结束


//  内容手动选择，返回false或者true
	$R.getContent__manualSelection = function ()
	{
		var
			_selection = $R.sel.getSelection($R.win),   // 得到选择的东西
			_range = $R.sel.getRange(_selection),
			_html = $R.sel.getRangeHTML(_range),
			_text = $R.sel.getRangeText(_range)
		;

		if (_html > '' && _text > ''); else // 首次调用？？2月29
		{
			_html = null;
			_text = null;

			$R.$document.find('frame, iframe').each(function (_i, _e)
			{
				if (_e.getAttribute('id') == 'readable_iframe') { return; }

				try
				{
					var
						__doc = $(_e).contents().get(0),
						__win = $R.sel.getWindowFromDocument(__doc),
						__selection = $R.sel.getSelection(__win),
						__range = $R.sel.getRange(__selection),
						__html = $R.sel.getRangeHTML(__range),
						__text = $R.sel.getRangeText(__range)
					;

					if (__html > '' && __text > '')
					{
						_html = __html;
						_text = __text;

						// stop the each
						return false;
					}
				}
				catch(e) { }
			});
		}

		//	haven't found anything
		if (_html > '' && _text > ''); else { return false; }

		//	probably selected something by mistake
		if ($R.measureText__getTextLength(_text) > (65 * 3 * 1.5)); else { return false; }

		//	display
		//	=======
			$R.$pages.html('');
			$R.displayPageHTML(_html, 1);

		//	return true
		return true;
	};// 内容手动选择结束


//	functions
//	=========

	$R.sel = {};

	$R.sel.getWindowFromDocument = function (theDocument)
	{
		if (theDocument); else { return null; }

		if ('defaultView' in theDocument) {
			arguments.calee = function (theDocument) {
				if (theDocument); else { return null; }
				return theDocument.defaultView;
			};
		}
		else if ('parentWindow' in theDocument) {
			arguments.calee = function (theDocument) {
				if (theDocument); else { return null; }
				return theDocument.parentWindow;
			};
		}
		else {
			arguments.calee = function (theDocument) {
				return null;
			};
		}

		return arguments.calee(theDocument);
	};

// 获得选择内容
	$R.sel.getSelection = function (theWindow)
	{
		if (theWindow); else { return null; }

		if ('getSelection' in theWindow) {
			arguments.calee = function (theWindow) {
				if (theWindow); else { return null; }
				return theWindow.getSelection();
			};
		}
		else if ('selection' in theWindow.document) {
			arguments.calee = function (theWindow) {
				if (theWindow); else { return null; }
				return theWindow.document.selection;
			};
		}
		else {
			arguments.calee = function (theWindow) {
				return null;
			};
		}

		return arguments.calee(theWindow);
	};

// 得到范围（没有选择文本就没有）
	$R.sel.getRange = function (selection)
	{
		if (selection); else { return null; }

		if ('getRangeAt' in selection) {
			arguments.calee = function (selection) {
				if (selection); else { return null; }
				if (selection.rangeCount > 0) { return selection.getRangeAt(0); }
				else { return null; }
				//	doesn't work in old versions of safari
				//	... I don't care
			};
		}
		else if ('createRange' in selection) {
			arguments.calee = function (selection) {
				if (selection); else { return null; }
				return selection.createRange();
			};
		}
		else {
			arguments.calee = function (selection) {
				return null;
			};
		}

		return arguments.calee(selection);
	};


	$R.sel.getRangeHTML = function (range)
	{
		if (range); else { return null; }

		if ('htmlText' in range) {
			arguments.calee = function (range) {
				if (range); else { return null; }
				return range.htmlText;
			};
		}
		else if ('surroundContents' in range) {
			arguments.calee = function (range) {
				if (range); else { return null; }
				var dummy = range.commonAncestorContainer.ownerDocument.createElement("div");
				dummy.appendChild(range.cloneContents());
				return dummy.innerHTML;
			};
		}
		else {
			arguments.calee = function (range) {
				return null;
			};
		}

		return arguments.calee(range);
	};


	$R.sel.getRangeText = function (range)
	{
		if (range); else { return null; }

		if ('text' in range) {
			arguments.calee = function (range) {
				if (range); else { return null; }
				return range.text;
			};
		}
		else if ('surroundContents' in range) {
			arguments.calee = function (range) {
				if (range); else { return null; }
				var dummy = range.commonAncestorContainer.ownerDocument.createElement("div");
				dummy.appendChild(range.cloneContents());
				return dummy.textContent;
			};
		}
		else {
			arguments.calee = function (range) {
				return null;
			};
		}

		return arguments.calee(range);
	};


//  内容发现（入口）
	$R.getContent__find = function ()
	{
		//	get content
		//	===========
			var
				_found = $R.getContent__findInPage($R.win),     // object
				_targetNode = _found._targetCandidate.__node,   // [object HTMLDivElement]
				_$targetNode = $(_targetNode)                   // [object Object]
			;

		//	RTL
		//	===
			switch (true)
			{
				case (_$targetNode.attr('dir') == 'rtl'):
				case (_$targetNode.css('direction') == 'rtl'):
					$R.makeRTL();
					break;
			}


		//	prev html => to fist target
		//	=========

			var
				_foundHTML = 	_found._html,
				_prevNode = 	_found._targetCandidate.__node,
				_prevHTML = 	'',
				_foundTitle = false
			;

			(function ()
			{
				while (true)
				{
					switch (true)
					{
						case ((_prevNode.tagName && _prevNode.tagName.toLowerCase() == 'body')):
						case ((_found._firstCandidate.__node != _found._targetCandidate.__node) && (_prevNode == _found._firstCandidate.__node)):
							return;
					}

					//	do it
					if (_prevNode.previousSibling)
					{
						//	previous
						_prevNode = _prevNode.previousSibling;

						//	get html
						var _h = $R.getContent__buildHTMLForNode(_prevNode, 'above-the-target');
						_prevHTML = _h + _prevHTML;
						_foundHTML = _h + _foundHTML;

						//	outline
						if ($R.debug && $R.measureText__getTextLength(_h.replace(/<[^>]+?>/gi, '')) > 0)
							{ $R.debugOutline(_prevNode, 'target', 'add-above'); }

						//	finished?
						if ($R.measureText__getTextLength(_prevHTML.replace(/<[^>]+?>/gi, '')) > (65 * 3 * 3)) { return; }

						//	found heading
						var _headingStartPos = _foundHTML.indexOf('<h1');
							_headingStartPos = (_headingStartPos > -1 ? _headingStartPos : _foundHTML.indexOf('<h2'));
							_headingStartPos = (_headingStartPos > -1 ? _headingStartPos : _foundHTML.indexOf('<h3'));

						if (_headingStartPos > -1)
						{
							var _toHeadingLength = $R.measureText__getTextLength(_foundHTML.substr(0, _headingStartPos).replace(/<[^>]+?>/gi, ''));
							if (_toHeadingLength < (65 * 3 * 2))
								{ _foundTitle = true; return; }
						}
					}
					else
					{
						_prevNode = _prevNode.parentNode;
					}
				}
			})();


		//	get document title（得到文档的标题）
		//	==================
			if (_foundTitle); else
			{
				if ($R.document.title > '')
				{
					var
						_the_title = '',
						_doc_title = $R.document.title,
						_doc_title_parts = [],
						_doc_title_pregs =
						[
							/( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i,
							/(([:] ))/i
						]
					;

					//	loop through pregs
					for (var i =0, _i=_doc_title_pregs.length; i<_i; i++)
					{
						//	split
						_doc_title_parts = _doc_title.split(_doc_title_pregs[i]);

						//	break if we managed a split
						if (_doc_title_parts.length > 1) { break; }
					}

					//	sort title parts
					//	longer goes higher up -- i.e. towards 0
					_doc_title_parts.sort(function (a, b)
					{
						switch (true)
						{
							case (a.length > b.length): return -1;
							case (a.length < b.length): return 1;
							default: return 0;
						}
					});

					//	more than one word?
					_the_title = (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _doc_title);

					//	add（增加标题）
					_foundHTML = '<h1>'+_the_title+'</h1>' + _foundHTML;
				}
			}

//        alert(_foundHTML);
		//	display
		//	=======
			$R.$pages.html('');
			$R.displayPageHTML(_foundHTML, 1);


		//	remember
		//	========
			$R.debugRemember['theTarget'] = _found._targetCandidate.__node;
			$R.debugRemember['firstCandidate'] = _found._firstCandidate.__node;


		//	next
		//	====
			$R.nextPage__loadedPages = [$R.win.location.href];
			$R.getContent__nextPage__find($R.win, _found._links);


		//	return
		return true;
	};// 内容发现结束


    /**
     * 得到内容（给跪了）
     * @param _pageWindow   object Window
     */
	$R.getContent__findInPage = function (_pageWindow)
	{
		//	calculations
		//	============
			var
				_firstCandidate = false,
				_secondCandidate = false,
				_targetCandidate = false
			;
			$R.debugTimerStart('ExploreAndGetStuff');
			var	_stuff = $R.getContent__exploreNodeAndGetStuff(_pageWindow.document.body);//疑点1

			$R.debugPrint('ExploreAndGetStuff', $R.debugTimerEnd()+'ms');

			$R.debugTimerStart('ProcessFirst');
				var _processedCandidates = $R.getContent__processCandidates(_stuff._candidates);//疑点2
				_firstCandidate = _processedCandidates[0];
				_targetCandidate = _firstCandidate;

			$R.debugPrint('ProcessFirst', $R.debugTimerEnd()+'ms');

            //  debug
			if ($R.debug)
			{
                //  debug first candidates
                $R.log('First 5 Main Candidates:');
				for (var x in _processedCandidates)
                {
                    if (x == 5) { break; }
                    $R.log(_processedCandidates[x], _processedCandidates[x].__node);
                }

                //  highlight first
                $R.debugOutline(_firstCandidate.__node, 'target', 'first');
                $(_firstCandidate.__node).css({'background-color': 'rgba(0, 255, 0, 0.25)'});
            }

            //  in case we stop
            $R.debugPrint('Target', 'first');


			//  do second?（_firstCandidate就是网站内容）
			switch (true)
			{
				case (!(_firstCandidate._count__containers > 0)):
				case (!(_firstCandidate._count__candidates > 0)):
				case (!(_firstCandidate._count__pieces > 0)):
				case (!(_firstCandidate._count__containers > 25)):
					break;

				default:

                    $R.debugTimerStart('ProcessSecond');
                        var _processedCandidatesSecond = $R.getContent__processCandidatesSecond(_processedCandidates);
                        _secondCandidate = _processedCandidatesSecond[0];
                    $R.debugPrint('ProcessSecond', $R.debugTimerEnd()+'ms');

                    //  they're the same
                    if (_firstCandidate.__node == _secondCandidate.__node) { break; }

                    //  debug
                    if ($R.debug)
                    {
                        //  log second candidates
                        $R.log('First 5 Second Candidates:');
                        for (var x in _processedCandidatesSecond)
                        {
                            if (x == 5) { break; }
                            $R.log(_processedCandidatesSecond[x], _processedCandidatesSecond[x].__node);
                        }

                        //  highlight second
                        $R.debugOutline(_secondCandidate.__node, 'target', 'second');
                        $(_secondCandidate.__node).css({'background-color': 'rgba(0, 0, 255, 0.25)'});
                    }


                    //  compute again
                    //  =============
                        _firstCandidate['__points_history_final'] = $R.getContent__computePointsForCandidateThird(_firstCandidate, _firstCandidate);
                        _firstCandidate['__points_final'] = _firstCandidate.__points_history_final[0];

                        _secondCandidate['__points_history_final'] = $R.getContent__computePointsForCandidateThird(_secondCandidate, _firstCandidate);
                        _secondCandidate['__points_final'] = _secondCandidate.__points_history_final[0];


                    //  log results
                    //  ===========
                        if ($R.debug)
                        {
                            $R.log('The 2 Candidates:');
                            $R.log(_firstCandidate);
                            $R.log(_secondCandidate);
                        }


                    //  are we selecting _second?
                    //  =========================
                        switch (true)
                        {
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters < 20) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 1):
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 20) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.9):
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 50) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.75):
                                _targetCandidate = _secondCandidate;
                                $R.debugPrint('Target', 'second');
                                break;
                        }



                    //  print points
                    //  ============
                        if ($R.debug)
                        {
                            $R.debugPrint('PointsFirst', _firstCandidate['__points_history_final'][0].toFixed(2));
                            $R.debugPrint('PointsSecond', _secondCandidate['__points_history_final'][0].toFixed(2));
                        }

					break;
			}


            //  highlight target
            //  ================
                if ($R.debug)
                {
                    $(_targetCandidate.__node).css({
                        'box-shadow':
                            'inset 0px 0px 50px rgba(255, 255, 0, 0.95), 0px 0px 50px rgba(255, 255, 0, 0.95)'
                    });
                }

		//	get html（_targetCandidate.__node）
		//	========
			$R.debugTimerStart('BuildHTML');
				var _html = $R.getContent__buildHTMLForNode(_targetCandidate.__node, 'the-target');
					_html = _html.substr((_html.indexOf('>')+1), _html.lastIndexOf('<'));
			$R.debugPrint('BuildHTML', $R.debugTimerEnd()+'ms');

			$R.debugTimerStart('BuildHTMLPregs');
				_html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*<br \/>)+/gi, '<$1$2>');
				_html = _html.replace(/(<br \/>\s*)+<\/(blockquote|div|p|td|li)>/gi, '</$2>');
				_html = _html.replace(/(<br \/>\s*)+<(blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '<$2$3>');
				_html = _html.replace(/<\/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*<br \/>)+/gi, '</$1>');
				_html = _html.replace(/(<hr \/>\s*<hr \/>\s*)+/gi, '<hr />');
				_html = _html.replace(/(<br \/>\s*<br \/>\s*)+/gi, '<br /><br />');
			$R.debugPrint('BuildHTMLPregs', $R.debugTimerEnd()+'ms');
		//	return
		//	======
			return {
				'_html': _html,
				'_links': _stuff._links,
				'_targetCandidate': _targetCandidate,
				'_firstCandidate': _firstCandidate
			};
	};// 得到内容



	//	find
	//	====
		$R.getContent__nextPage__find = function (_currentPageWindow, _linksInCurrentPage)
		{
			//	page id
				var _pageNr = ($R.nextPage__loadedPages.length + 1);

			//	get
			//	===
				var _possible = [];
				if (_possible.length > 0); else { _possible = $R.getContent__nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.5); }
				//if (_possible.length > 0); else { _possible = $R.getContent__nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.50); }

				//	none
				if (_possible.length > 0); else
					{ if ($R.debug) { $R.log('no next link found'); } return; }

				$R.log('possible next', _possible);

			//	the one
			//	=======
				var _nextLink = false;

			//	next keyword?
			//	=============
				(function ()
				{
					if (_nextLink) { return; }

					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++)
						{
							if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._caption.length > $R.nextPage__captionKeywords[j].length * 2)
										{ continue; }

								//	not keywords
								//	============
									for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z; z++)
									{
										if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords__not[z]) > -1)
											{ _nextLink = false; return; }
									}

								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();

			//	caption matched page number
			//	===========================
				(function ()
				{
					if (_nextLink) { return; }

					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						if (_possible[i]._caption == (''+_pageNr))
							{ _nextLink = _possible[i]; return; }
					}
				})();

			//	next keyword in title
			//	=====================
				(function ()
				{
					if (_nextLink) { return; }

					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						//	sanity
						if (_possible[i]._title > ''); else { continue; }
						if ($R.measureText__getTextLength(_possible[i]._caption) <= 2); else { continue; }

						for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++)
						{
							if (_possible[i]._title.indexOf($R.nextPage__captionKeywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._title.length > $R.nextPage__captionKeywords[j].length * 2)
										{ continue; }

								//	not keywords
								//	============
									for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z; z++)
									{
										if (_possible[i]._title.indexOf($R.nextPage__captionKeywords__not[z]) > -1)
											{ _nextLink = false; return; }
									}

								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();

			//	return?
			//	=======
				if (_nextLink); else { return; }

			//	mark
			//	====
				$R.debugPrint('NextPage', 'true');

				if ($R.debug)
				{
					$R.debugOutline(_nextLink._node, 'target', 'next-page');
					$R.log('NextPage Link', _nextLink, _nextLink._node);
				}

			//	process page
			//	============
				$R.getContent__nextPage__loadToFrame(_pageNr, _nextLink._href);
				$R.nextPage__loadedPages.push(_nextLink._href);
		};


	//	find with similarity
	//	====================
		$R.getContent__nextPage__find__possible = function (_currentPageWindow, _linksInCurrentPage, _distanceFactor)
		{
			var
				_mainPageHref = $R.win.location.href,
				_mainPageDomain = $R.getContent__nextPage__find__getLinkDomain(_mainPageHref),
				_mainPagePath = $R.getContent__nextPage__find__getLinkPath(_mainPageHref)
			;

			var _links = $.map
			(
				_linksInCurrentPage,
				function (_element, _index)
				{
					var
						_href = _element.__node.href,
						_path = $R.getContent__nextPage__find__getLinkPath(_href),
						_title = (_element.__node.title > '' ? _element.__node.title.toLowerCase() : ''),
						_caption = _element.__node.innerHTML.replace(/<[^>]+?>/gi, '').replace(/\&[^\&\s;]{1,10};/gi, '').replace(/\s+/gi, ' ').replace(/^ /, '').replace(/ $/, '').toLowerCase(),
						_distance = levenshteinForReadable(_mainPagePath, _path)
					;

					var _caption2 = '';
					for (var i=0, _i=_caption.length, _code=0; i<_i; i++)
					{
						_code = _caption.charCodeAt(i);
						_caption2 += (_code > 127 ? ('&#'+_code+';') : _caption.charAt(i));
					}
					_caption = _caption2;

					switch (true)
					{
						case (!(_href > '')):
						case (_mainPageHref.length > _href.length):
						case (_mainPageDomain != $R.getContent__nextPage__find__getLinkDomain(_href)):
						case (_href.substr(_mainPageHref.length).substr(0, 1) == '#'):
						case (_distance > Math.ceil(_distanceFactor * _path.length)):
							return null;

						default:
							//	skip if already loaded as next page
							for (var i=0, _i=$R.nextPage__loadedPages.length; i<_i; i++)
								{ if ($R.nextPage__loadedPages[i] == _href) { return null; } }

							//	return
							return {
								'_node': _element.__node,
								'_href': _href,
								'_title': _title,
								'_caption': _caption,
								'_distance': _distance
							};
					}
				}
			);

			//	sort -- the less points, the closer to position 0
			//	====
				_links.sort(function (a, b)
				{
					switch (true)
					{
						case (a._distance < b._distance): return -1;
						case (a._distance > b._distance): return 1;
						default: return 0;
					}
				});


			//	return
				return _links;
		};


		$R.getContent__nextPage__find__getLinkPath = function (_href)
		{
			return _href.substr(_href.indexOf('/', 9));
		};

		$R.getContent__nextPage__find__getLinkDomain = function (_href)
		{
			var
				_firstSlash = _href.indexOf('/', 9),
				_theDomain = _href.substr(0, _firstSlash)
			;

			return _theDomain;
		};


	//	levenshtein
	//	===========
		function levenshteinForReadable(str1, str2)
		{
			var l1 = str1.length, l2 = str2.length;
			if (Math.min(l1, l2) === 0)
				{ return Math.max(l1, l2); }

			var i = 0, j = 0, d = [];
			for (i = 0 ; i <= l1 ; i++)
			{
				d[i] = [];
				d[i][0] = i;
			}

			for (j = 0 ; j <= l2 ; j++)
				{ d[0][j] = j; }

			for (i = 1 ; i <= l1 ; i++)
			{
				for (j = 1 ; j <= l2 ; j++)
				{
					d[i][j] = Math.min
					(
						d[i - 1][j] + 1,
						d[i][j - 1] + 1,
						d[i - 1][j - 1] + (str1.charAt(i - 1) === str2.charAt(j - 1) ? 0 : 1)
					);
				}
			}
			return d[l1][l2];
		}


	//	load to frame
	//	=============
		$R.getContent__nextPage__loadToFrame = function (_pageNr, _nextPageURL)
		{
			//	do ajax
			//	=======
				$.ajax
				({
					'url' : _nextPageURL,

					'type' : 'GET',
					'dataType' : 'html',
					'async' : true,
					'timeout': (10 * 1000),

					//'headers': { 'Referrer': _nextPageURL },

					'success' : function (_response, _textStatus, _xhr)	{ $R.getContent__nextPage__ajaxComplete(_pageNr, _response, _textStatus, _xhr); },
					'error' : 	function (_xhr, _textStatus, _error)	{ $R.getContent__nextPage__ajaxError(_pageNr, _xhr, _textStatus, _error); }
				});
		};


	//	ajax calbacks
	//	=============
		$R.getContent__nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error)
		{
		};

		$R.getContent__nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr)
		{
			//	valid?
			//	======
				if (_response > ''); else { return; }

			//	script
			//	======
				var _script = ''
					+ '<script type="text/javascript">'
					+ ' function __this_page_loaded()'
					+ '	{'
					+ ' 	window.setTimeout('
					+ ' 		function () { window.parent.parent.$readable.getContent__nextPage__loadedInFrame("'+_pageNr+'", window); }, '
					+ ' 		250'
					+ ' 	);'
					+ ' } '

					+ ' if (document.readyState); else { __this_page_loaded(); } '

					+ ' function __this_page_loaded_ready(delayedNrTimes)'
					+ ' {'
					+ ' 	if (document.readyState != "complete" && delayedNrTimes < 30)'
					+ '			{ setTimeout(function () { __this_page_loaded_ready(delayedNrTimes+1); }, 100); return; }'

					+ ' 	__this_page_loaded();'
					+ ' }'

					+ ' __this_page_loaded_ready(0);'
					+ '</script>'
				;

			//	get html
			//	========
				var _html = _response;

				//	normalize
				//	=========
					_html = _html.replace(/<\s+/gi, '<');
					_html = _html.replace(/\s+>/gi, '>');
					_html = _html.replace(/\s+\/>/gi, '/>');

				//	remove
				//	======
					_html = _html.replace(/<script[^>]*?>([\s\S]*?)<\/script>/gi, '');
					_html = _html.replace(/<script[^>]*?\/>/gi, '');
					_html = _html.replace(/<noscript[^>]*?>([\s\S]*?)<\/noscript>/gi, '');

				//	add load handler
				//	================
					_html = _html.replace(/<\/body/i, _script+'</body');


			//	append frame
			//	============
				$R.$nextPages.append(''
					+ '<iframe'
					+ ' id="nextPageFrame__'+_pageNr+'"'
					+ ' scrolling="no" frameborder="0"'
					+ '></iframe>'
				);

			//	write to frame
			//	==============
				var _doc = $('#nextPageFrame__'+_pageNr).contents().get(0);
					_doc.open();
					_doc.write(_html);
					_doc.close();
		};


	//	loaded in frame
	//	===============
		$R.getContent__nextPage__loadedInFrame = function (_pageNr, _pageWindow)
		{
			//	find
			//	====
				var _found = $R.getContent__findInPage(_pageWindow);

			//	display
			//	=======
				$R.displayPageHTML(_found._html, _pageNr);

			//	next
			//	====
				$R.getContent__nextPage__find(_pageWindow, _found._links);
		};


		//	display HTML
		//	============

	$R.displayPageHTML = function (_processedPageHTML, _pageNr)
	{
		//	separator
		//	=========
			if (_pageNr > 1)
			{
				$R.$pages.append(''
					+ '<div class="pageSeparator">'
					+	'<div class="pageSeparatorLine setTextColorAsBackgroundColor"></div>'
					+ 	'<div class="pageSeparatorLabel"><span>'+$R.translate('misc__page')+' '+_pageNr+'</span></div>'
					+ '</div>'
				);
			}

		//	display processed
		//	=================
			$R.$pages.append(''
				+ '<div class="page" id="page'+_pageNr+'">'
				+ 	_processedPageHTML
				+ '</div>'
			);

		//	links as footnotes
		//	==================
			$('#page'+_pageNr).find('a').each(function (_index, _element)
			{
				//	check
				var _href = _element.href;
				if (_href > ''); else { return; }
				if (_href.indexOf); else { return; }
				if (_href.indexOf('#') > -1) { return; }

				//	count
				var _nr = ++$R.footnotedLinksCount;

				//	add
				$(_element).append(' <sup class="readableLinkFootnote">['+_nr+']</sup>');
				$R.$footnotedLinks.append('<li>'+_href+'</li>');
			});
	};


		//	appear
		//	======

	//	var
	//	===
		$R.visible = false;

		$R.pagePositionBeforeShow__x = 0;
		$R.pagePositionBeforeShow__y = 0;

	//	content
	//	=======
		$R.hideContent = function () { $R.$box.hide(); $R.$loading.hide(); };
		$R.showContent = function () { $R.$box.show(); $R.$loading.hide(); $R.scrolledWindowWhileReadableVisible(); }

	//	show
	//	====
		$R.show = function (_endFunction)
		{
			//	bind scroll
			//	===========
				$R.$document.bind('scroll', $R.scrolledWindowWhileReadableVisible);

			//	get specs
			//	=========
				var _width = $R.$iframe.width();

			//	prepare
			//	=======
				$R.$document.find('body, html').addClass('readableBeforeVisible');
				$R.hideContent();

				$R.$sidebar.addClass('belowBackground withoutShading');
				$R.$sidebar.css({'right': '-100px'});

				$R.$backgroundShading.show();
				$R.$background.css({'right': _width+'px'});

			//	scroll
			//	======
				$R.pagePositionBeforeShow__x = $R.$win.scrollLeft();
				$R.pagePositionBeforeShow__y = $R.$win.scrollTop();

				window.scrollTo(0, 0);
				$R.win.scrollTo(0, 0);

			//	show frame
			//	==========
				$R.$iframe.css({'top': '0px', 'left': '0px'});

			//	slide background
			//	================
				$R.$background.animate
				(
					{'right': '50px'},
					500,
					'readableEasingBackgroundShow',
					function ()
					{
						$R.$loading.show();
						$R.$sidebar.css({'right': '50px'});

						//	slide sidebar
						//	=============
							$R.$sidebar.animate
							(
								{'right': '0px'},
								500,
								'readableEasingSidebarShow',
								function ()
								{
									//	end animation
									//	=============
										$R.$sidebar.removeClass('belowBackground withoutShading');
										$R.$document.find('body, html').addClass('readableVisible');
										$('html').addClass('readableVisible');
										$R.$background.css({'right': '0px'});

									//	focus
									//	=====
										if (window.focus) { window.focus(); }

									//	finished
									//	========
										$R.visible = true;

									//	end function
									//	============
										if (_endFunction && _endFunction.call)
											{ _endFunction.call(); }
								}
							);
					}
				);
		};


	//	hide
	//	====
		$R.hide = function (_endFunction)
		{
			//	get specs
			//	=========
				var _width = $R.$iframe.width();

			//	hide dialog
			//	===========
				$R.hideOpenDialog();

			//	unbind scroll
				$R.$document.unbind('scroll', $R.scrolledWindowWhileReadableVisible);

			//	prepare
				$R.$background.css({'right': '50px'});
				$R.$sidebar.addClass('belowBackground withoutShading');
				$R.$backgroundShading.show();

			//	inverse
				$R.hideContent();
				$('html').removeClass('readableVisible');
				$R.$document.find('body, html').removeClass('readableVisible');

			//	slide sidebar
			//	=============
				$R.$sidebar.animate
				(
					{'right': '50px'},
					100,
					'readableEasingSidebarHide',
					function ()
					{
						$R.$sidebar.css({'right': '-100px'});

						//	slide background
						//	================
							$R.$background.animate
							(
								{'right': _width+'px'},
								500,
								'readableEasingBackgroundHide',
								function ()
								{
									//	end animation
									//	=============
										$R.$document.find('body, html').removeClass('readableBeforeVisible');

									//	show frame
									//	==========
										$R.$iframe.css({'top': '-100%', 'left': '-100%'});

									//	scroll
									//	======
										$R.$win.scrollLeft($R.pagePositionBeforeShow__x);
										$R.$win.scrollTop($R.pagePositionBeforeShow__y);

									//	focus
									//	=====
										if ($R.win.focus) { $R.win.focus(); }

									//	finished
									//	========
										$R.visible = false;

									//	end function
									//	============
										if (_endFunction && _endFunction.call)
											{ _endFunction.call(); }
								}
							);
					}
				);

		};


	//	scrolled
	//	========
		$R.scrolledWindowWhileReadableVisible = function ()
		{
			//	in case main window somehow gets scrolled,
			//	scroll it back

			$R.win.scrollTo(0, 0);
		};


	//	custom easing -- http://timotheegroleau.com/Flash/experiments/easing_function_generator.htm
	//	=============

		$.easing['readableEasingBackgroundShow'] = function (x, t, b, c, d)
		{
			/* out cubic :: variation */
			var ts=(t/=d)*t;
			var tc=ts*t;
			return b+c*(-2.5*tc*ts + 10*ts*ts + -14*tc + 7*ts + 0.5*t);
		};

		$.easing['readableEasingSidebarShow'] = function (x, t, b, c, d)
		{
			/* out elastic (small) :: variation */
			var ts=(t/=d)*t;
			var tc=ts*t;
			return b+c*(20.05*tc*ts + -65.25*ts*ts + 79.7*tc + -44.6*ts + 11.1*t);
		};

		$.easing['readableEasingBackgroundHide'] = function (x, t, b, c, d)
		{
			/* out cubic :: variation */
			var ts=(t/=d)*t;
			var tc=ts*t;
			return b+c*(-2.5*tc*ts + 10*ts*ts + -14*tc + 7*ts + 0.5*t);
		};

		$.easing['readableEasingSidebarHide'] = function (x, t, b, c, d)
		{
			/* out cubic :: variation */
			var ts=(t/=d)*t;
			var tc=ts*t;
			return b+c*(-2.5*tc*ts + 10*ts*ts + -14*tc + 7*ts + 0.5*t);
		};


		//	launch
		//	======

	//	clicked
	//	=======
		$R.bookmarkletClicked = function ()
		{
			//	log -- console might not have been activated on first run
			//	===
				if ($R.debug) { $R.initializeWriteLogFunction(); }

			//	blank page -- mini show
			//	==========（如果坑爹就报错）
            switch (true)
            {
                case (window.parent.location.href.indexOf('chrome:') === 0):    // 如果是chrome开始的地址。主坑爹了。
                case (window.parent.location.href.indexOf('about:') === 0):

                    $R.$document.find('body, html').addClass('readableBeforeVisible readableVisible');
                    $('html').addClass('readableVisible');

                    window.scrollTo(0, 0);
                    $R.win.scrollTo(0, 0);

                    $('#blank_error').show();

                    $R.$iframe.css({'top': '0px', 'left': '0px'});

                    return;
            }


			//	already visible, but now clipping
			//	=================================
            if ($R.visible && $R.clipOnFirstLaunch && $R.clipOnFirstLaunch == true)
            {
                $R.clipOnFirstLaunch = false;
                $R.bookmarkletTimer = false;

                $R.menu_functions['clip_to_evernote'].call();

                return;
            }


			//	already visible? -- hide
			//	================
            if ($R.visible)
            {
                $R.hide(function() { $R.bookmarkletTimer = false; });
                return;
            }


			//	show -- apply options; load fonts; get content
			//	====

            //	get options -- in case they changed

            $R.getFromExtension__options(); // 各种初始化


				//	apply options -- in case they changed
				$R.applyOptions();  // 各种配置信息

				//	show -> get content
				$R.show(function ()
				{
                    //  actually show
                    //  =============
                        $R.applyOptions__fonts();
                        $R.getContent();    //  得到内容了

                    //  clip on launch
                    //  ==============
                        if ($R.clipOnFirstLaunch && $R.clipOnFirstLaunch == true)
                        {
                            $R.clipOnFirstLaunch = false;
                            $R.menu_functions['clip_to_evernote'].call();
                        }

                    //  timer
                    //  =====
                        $R.bookmarkletTimer = false;

                    //  track event
                    //  ===========

                            if ($R.trackedView); else
                            {
                                //  mark
                                $R.trackedView = true;

                                //  trigger
                                $R.customEvents.dispatch(
                                    $R.customEvents.names_to_objects['to-extension--track--view'],
                                    $R.document,
                                    $R.win
                                );
                            }

				});
		};


	//	fix flash
	//	=========
		$R.$document.find("param[name='wmode']").attr('value', 'opaque');
		$R.$document.find("embed").attr('wmode', 'opaque');


	//	custom hook
	//	===========
		if ($R.beforeLaunchHook) { $R.beforeLaunchHook(); }


	//	auto-launch
	//	===========
		$R.bookmarkletClicked();


	})(window.parent.$readable);
});